原文链接:http://blog.csdn.net/wang907553141/article/details/52143128
原文参考博客:http://blog.csdn.net/acdreamers/article/details/8037918
下面附上Lucas定理的代码:
const LL mod=1e9+7;
typedef long long LL;
LL n,m;
LL quickPow(LL a,LL k)
{//快速幂求a^k%mod
LL ans=1;
while(k)
{
if(k&1)//相与运算,如果k是奇数那么结果为真,执行下面操作
ans=(ans*a)%mod;
a=(a*a)%mod;
k>>=1;
}
return ans;
}
LL C(LL a,LL b,LL p)
{//求从n个数中挑出m个数的组合数
if(a<b)
return 0;
if(b>a-b)
b=a-b;
LL up=1,down=1;
for(LL i=0;i<b;i++)
{
up=up*(a-i)%p;
down=down*(i+1)%p;
}
return up*quickPow(down,p-2)%p;//乘法逆元(费马小定理)
}
LL lucas(LL a,LL b,LL p)
{
if(b==0)
return 1;
return C(a%p,b%p,p)*lucas(a/p,b/p,p)%p;
}