HDU3037
解题思路:
题目可以转换成 x1+x2+……+xn=m 有多少组解,m在题中可以取0~m。
利用插板法可以得出x1+x2+……+xn=m解的个数为C(n+m-1,m);
则题目解的个数可以转换成求 sum=C(n+m-1,0)+C(n+m-1,1)+C(n+m-1,2)……+C(n+m-1,m)
利用公式C(n,r)=C(n-1,r)+C(n-1,r-1) == > sum=C(n+m,m)。
现在就是要求C(n+m,m)%p。
因为n,m很大,这里可以直接套用Lucas定理的模板即可。
Lucas(n,m,p)=C(n%p,m%p,p)*Lucas(n/p,m/p,p); ///这里可以采用对n分段递归求解,
Lucas(x,0,p)=1;
将n,m分解变小之后问题又转换成了求(a/b)%p。
(a/b)%p可以转换成a*Inv(b,p) Inv(b,p)为b对p的逆元。

浙公网安备 33010602011771号