hdu1573中国剩余问题定理模数非互质的的情况
2012-08-02 10:23
267 查看
依旧没弄懂。。先会用模版再说。。
注意讨论(ans==-1)的情况
注意讨论(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; }
相关文章推荐
- HDU 1573 X问题 (非互质情况下的中国剩余定理)
- hdu1573 X问题 中国剩余定理
- HDU - 1573 - X问题(中国剩余定理不满足互质情况下的求解)
- hdu1573 X问题(中国剩余定理 不互质)
- hdu 1573 X问题 (非互质的中国剩余定理)
- hdu1573 X问题(中国剩余定理解的个数)
- 模数非互质的同余方程组(非互质版中国剩余定理)
- 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
- hdu 1573(中国剩余定理非互质情况)
- HDOJ 1573 X问题(中国剩余定理非互质版本)
- hdu1573 X问题 中国剩余定理
- hdu1573 X问题 中国剩余定理 待补完
- hdu1573 X问题 中国剩余定理
- 【HDU1573】X问题 中国剩余定理
- HDU/HDOJ 1573 X问题 非互质情况下的中国剩余定理
- X问题(中国剩余定理+不互质版应用)hdu1573
- hdu1573 中国剩余问题定理 模数非互质
- HDU 3579 Hello Kiki 中国剩余定理 不互质情况
- hdu1573(中国剩余定理定解的个数)
- 中国剩余定理与韩信点兵问题原理