费马小定理+Lucas定理 大组合数取模

来源:互联网 发布:js编码 编辑:程序博客网 时间:2024/05/28 06:04



#include<stdio.h>long long factorial[10010];long long quick(long long a,long long n,long long p);long long com(long long k,long long n);long long Lucas(long long k,long long n,long long p);void fac(int p);int main(){long long a,b,k,n,m;fac(10007);scanf("%lld%lld%lld%lld%lld",&a,&b,&k,&n,&m);printf("%lld\n",quick(a,n,10007)*quick(b,m,10007)%10007*Lucas(k,n,10007)%10007);return 0;}long long quick(long long a,long long n,long long p)//快速幂{long long ans=1;while(n>0){if(n%2!=0)ans=ans*a%p;n/=2;a=a*a%p;}return ans;}void fac(int p)//阶乘求模{int i;factorial[0]=1;for(i=1;i<=p;i++)factorial[i]=factorial[i-1]*i%p;}long long Lucas(long long k,long long n,long long p){long long kk,nn;long long ans=1;while(k&n){kk=k%p;nn=n%p;if(kk<nn)return 0;//待证明:对于组合数C(n,k),若k%p>n%p,一定有p整除C(n,k)ans=ans*factorial[kk]*quick(factorial[kk-nn]*factorial[nn]%p,p-2,p);//此处用到费马小定理求逆元k/=p;n/=p;}return ans;}