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 150000 long 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)%p long 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)%p long 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; }