标签:
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2209 Accepted Submission(s): 821
#include<iostream> #include<stdio.h> using namespace std; long long pri[15]; long long a[15]; long long ext_gcd(long long a,long long b,long long *x,long long *y) { if(b==0) { *x=1,*y=0; return a; } long long r = ext_gcd(b,a%b,x,y); long long t = *x; *x= *y; *y = t - a/b * *y; return r; } long long quick_mod(long long n,long long m,long long mod) { long long ans=1; while(m) { if(m&1) ans=(ans*n)%mod; m>>=1; n=(n*n)%mod; } return ans%mod; } long long get_c(long long n,long long m,long long mod) { long long a=1,b=1; for(int i=1; i<=m; i++) { b=b*i%mod; a=a*(n-i+1)%mod; } return (a*(quick_mod(b,mod-2,mod)))%mod; } long long Lucas(long long n,long long m,long long mod) { if(m==0) return 1; return (Lucas(n/mod,m/mod,mod)*get_c(n%mod,m%mod,mod))%mod; } long long mul(long long a,long long n,long long mod) { a = (a%mod+mod)%mod; n = (n%mod+mod)%mod; long long ret =0; while(n) { if(n&1) ret=(ret+a)%mod; a=(a+a)%mod; n>>=1; } return ret%mod; } long long chinese_reminder(long long a[],long long pri[],int len) { long long mul_pri=1; long long res=0; for(int i=0;i<len;i++) { mul_pri*=pri[i]; } for(int i=0;i<len;i++) { long long m = mul_pri/pri[i]; long long x,y; ext_gcd(pri[i],m,&x,&y); //res=(res+y*m*a[i])%mul_pri; res=(res+mul(mul(y,m,mul_pri),a[i],mul_pri))%mul_pri; } return ((res%mul_pri+mul_pri)%mul_pri); } int main() { int t; long long n,m; int k; scanf("%d",&t); while(t--) { scanf("%I64d%I64d%d",&n,&m,&k); for(int i=0; i<k; i++) scanf("%I64d",pri+i); for(int i=0; i<k; i++) { a[i]=Lucas(n,m,pri[i]); } long long ans = chinese_reminder(a,pri,k); printf("%I64d\n",ans); } return 0; }
hdu 5446 Unknown Treasure Lucas定理+中国剩余定理
标签:
原文地址:http://www.cnblogs.com/superxuezhazha/p/5772357.html