Lucas定理(C(n,m)mod p)

来源:互联网 发布:数据结构与算法的关系 编辑:程序博客网 时间:2024/05/23 07:23


Lucas定理

卢卡斯定理及证明:


表达式也可以表示为:Lucas(n,m,p)=C(n%p,m%p)* Lucas(n/p,m/p,p)

简单的说,Lucas定理是用来求C(n,m) mod p的值(p是素数)。


#include <cstdio>#include <iostream>using namespace std;#define MAX 150000long long fac[MAX];//阶乘:fac[i]=i!void Factorial(long long p){    fac[0]=1;    for(int i=1;i<=p;i++)        fac[i]=fac[i-1]*i%p;}//快速幂:(a^b)%plong long Pow(long long a,long long b,long long p){    long long c=a%p,s=1;    while(b)    {        if(b&1)            s=s*c%p;        c=c*c%p;        b>>=1;    }    return s;}//组合:C(n,m)%plong long C(long long n,long long m,long long p){    if(n<m)        return 0;    return fac[n]*Pow(fac[m]*fac[n-m],p-2,p)%p;}//Lucas定理:Lucas(n,m,p)=C(n%p,m%p)*Lucas(n/p,m/p,p)(其中Lucas(n,0,p)=1)long long Lucas(long long n,long long m,long long p){    if(m==0)        return 1;    return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p;}int main(){    long long n,m,p,t;    scanf("%I64d",&t);    while(t--)    {        scanf("%I64d%I64d%I64d",&n,&m,&p);        Factorial(p);        printf("%I64d\n",Lucas(n,m,p));    }    return 0;}


0 0
原创粉丝点击