组合数取模

来源:互联网 发布:淘宝网西服 编辑:程序博客网 时间:2024/06/03 04:55

原文链接: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;}