hdu1573中国剩余问题定理模数非互质的的情况
依旧没弄懂。。先会用模版再说。。
注意讨论(ans==-1)的情况
#include<iostream> #define llint long long int using namespace std; const int MAXM=12; llint exgcd(llint a, llint b, llint &x, llint &y) { if(b == 0){ x = 1, y = 0; return a;} llint r = exgcd(b, a % b, x, y); llint tmp = x; x = y; y = tmp - a/b * y; return r; } long long int lcm(long long int a,long long int b) { llint x,y; return (a*b)/(exgcd(a,b,x,y)); } llint crr(llint mm[],llint rr[],llint n) { llint m1=mm[0]; llint r1=rr[0]; llint i; bool flag; for ( i = 0; i < n - 1; i++) { llint m2=mm[i+1]; llint r2=rr[i+1]; if (flag) continue; llint x,y; llint d = exgcd(m1,m2,x,y); llint c = r2 - r1; if (c % d) { flag = 1; continue; } llint t=m2/d; x=(c/d*x%t+t)%t; r1=m1*x+r1; m1=m1*m2/d; } if(!flag) { if (r1==0&&n>1) { r1=mm[0]; __int64 ans=1; llint x,y; for (i=1;i<n;i++) { r1=exgcd(mm[i],r1,x,y); } for ( i=0;i<n;i++) { ans*=mm[i]; } r1=ans/r1; } if (r1==0&&n==1) r1=mm[0]; return r1; }else { return -1; } } int main() { llint T; cin>>T; while(T--) { llint N,M; llint a[MAXM],b[MAXM]; cin>>N>>M; llint i; llint mt=1; for(i=0;i<=M-1;i++) { cin>>a[i]; mt=lcm(mt,a[i]); } for(i=0;i<=M-1;i++) { cin>>b[i]; } llint ans=crr(a,b,M); // cout<<ans<<"|"<<mt<<endl; if(ans==-1) { cout<<0<<endl; continue; } if(ans<N) { cout<<(N-ans)/mt+1<<endl; }else { cout<<0<<endl; } //cout<<(N-ans)/mt<<endl; } return 0; }
本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
独立博客:http://nfeng.cc/