[模板]-卢卡斯(Lucas)定理

来源:互联网 发布:淘宝维修售后怎么处理 编辑:程序博客网 时间:2024/05/21 07:01

问题描述:

给定n,m,p(1\le n,m,p\le 10^51n,m,p105)

求 C_{n+m}^{m}\ mod\ pCn+mm mod p

保证P为prime

C表示组合数。

代码:

long long n,m,p,fac[100010];void fact()//计算1到p的阶乘并对p取模{    fac[0] = 1;    for(int i = 1; i <= p; ++i)        fac[i] = fac[i - 1] * i % p;}long long QuickPower(long long a,long long n)//快速幂,对p取模{    long long ans = 1;    while(n > 0)    {        if(n & 1)            ans = ans * a % p;// mod!!!        n /= 2;        a = a * a % p;// mod!!!    }    return ans;}long long C(long long n,long long m)//组合数{    if(m > n)        return 0;    return fac[n] * QuickPower(fac[m] * fac[n - m],p - 2) % p;}long long Lucas(long long n,long long m)//卢卡斯定理{    if(m == 0)        return 1;    return (C(n % p,m % p) * Lucas(n / p,m / p)) % p;//递归}int main(){int _;cin >> _;while(_--)    {        scanf("%lld%lld%lld",&n,&m,&p);        fact();//位置        printf("%lld\n",Lucas(n + m,m));    }    return 0;}



原创粉丝点击