【数据范围】
对于30%的数据,保证1<=m<=n<=1000
对于100%的数据,保证1<=m<=n<=1000000
蒟蒻表示只会nk的DP,承担不起根据题解考虑转化模型,变为从(0,0)走到(n+m,n-m),1表示斜向上走比如(0,0)走到(1,0),0则相反那么总数为C(n+m,m),再考虑错误情况那就是走到过-1的这些情况,那么对-1取对称,其实就是跑了y轴中-2往上的情况走到(n+m,n-m)需要向上走n-m+2次,一共要走n+m次。设向上向下各走x,y,那么x+y=n+m,x-y=n-m+2得到x=n+1,y=m-1,所以不合法的方案为C(n+m,m-1)实力太弱实在无力
//MT_LI #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll; ll mod=20100403ll; int n,m; ll pow_mod(ll a,ll b) { ll ans=1ll; while(b) { if(b&1)ans=ans*a%mod; b/=2;a=a*a%mod; } return ans; } ll fac[2100000]; void init() { fac[1]=1ll; for(ll i=2;i<=2000000;i++) fac[i]=fac[i-1]*i%mod; } int main() { init(); scanf("%d%d",&n,&m); printf("%lld\n",(fac[n+m]*pow_mod(fac[n],mod-2)%mod*pow_mod(fac[m],mod-2)%mod-fac[n+m]*pow_mod(fac[m-1],mod-2)%mod*pow_mod(fac[n+1],mod-2)%mod+mod)%mod); return 0; }
原文:https://www.cnblogs.com/MT-LI/p/9869753.html