首先lucas定理是指对于一个
Lucas(n,m,p)=C(n%p,m%p)*Lucas(n/p,m/p,p)
(p是质数)
解决组合的取模问题(解决mod的数字过大问题,排列取模可不能随便取)
需要注意的是对于lucas,需要计算出0-n,0-m的可以计算的全部组合,包括C(0,0)
然后如果取模对象p不是质数,那么可以用中国剩余定理来合,也就是分别如1001,对每个C(n,m)都分解成对7,11,13取模,然后用中国剩余定理合成出最后一个数再*
ll Extended_Euclid(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法
{
ll d;
if(b==0)
{
x=1;y=0;
return a;
}
d=Extended_Euclid(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll Chinese_Remainder(ll a[],ll w[],ll len)//中国剩余定理 a[]存放余数 w[]存放两两互质的数
{
ll i,d,x,y,m,n,ret;
ret=0;
n=1;
for (i=0;i<len;i++)
n*=w[i];
for (i=0;i<len;i++)
{
m=n/w[i];
d=Extended_Euclid(w[i],m,x,y);
ret=(ret+y*m*a[i])%n;
}
return (n+ret%n)%n;
}