pij2891 扩展欧几里得中国剩余定理
2013-04-11 14:57
351 查看
代码思想来自scturtle's 渣代码集散地,转载请注明出处
不互质的中国剩余定理:利用扩展欧几里得定理将方程两两合并求解
代码如下:
不互质的中国剩余定理:利用扩展欧几里得定理将方程两两合并求解
假设C ≡ A1 (mod B1),C ≡ A2 (mod B2)。令C = A1 + X1B,那么X1B1 ≡ A2 − A1 (mod B2)。用扩展欧几里德算法求出X1,也就求出C。令B = lcm(B1, B2),那么上面两条方程就可以被C’ ≡ C (mod B)代替。迭代直到只剩下一条方程。
你可以理解为新的答案C'即要mod B1,又要mod B2,所以就mod lcm(B1, B2)。而余数C 是刚前面求得的答案,也就是说C'不管怎么折腾,都还会保留一个C,即不会破坏前面的成果!
你可以理解为新的答案C'即要mod B1,又要mod B2,所以就mod lcm(B1, B2)。而余数C 是刚前面求得的答案,也就是说C'不管怎么折腾,都还会保留一个C,即不会破坏前面的成果!
代码如下:
/* 参考别人的代码,欧几里得中国剩余定理 */ #include <stdio.h> #include <iostream> #include <string.h> using namespace std; long long ax,by; long long ex_gcd(long long a,long long b) { if(b==0) { ax=1; by=0; return a; } long long gcd=ex_gcd(b,a%b); long long temp=ax; ax=by; by=temp-a/b*by; return gcd; } int main() { int t; while(cin>>t) { long long m1,r1,m2,r2,gcd; cin>>m1>>r1; int flag=0; for(int i=0;i<t-1;i++) { cin>>m2>>r2; if(flag) continue; gcd=ex_gcd(m1,m2); long long c=r2-r1; if(c%gcd) { flag=1; continue; } long long t=m2/gcd; ax=ax*c/gcd; ax=(ax%t+t)%t; r1=m1*ax+r1; m1=m2/gcd*m1; } if(flag) printf("-1\n"); else cout<<r1<<endl; } return 0; }
相关文章推荐
- Strange Way to Express Integers--扩展欧几里得和中国剩余定理
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
- 欧几里得+扩展的欧几里得算法+线性同余方程+中国剩余定理
- poj1006_Biorhythms_扩展欧几里得_中国剩余定理
- bzoj 1407: [Noi2002]Savage【扩展欧几里得+中国剩余定理】
- poj2891——Strange Way to Express Integers(扩展欧几里得解中国剩余定理)
- POJ 2891 Strange Way to Express Integers[中国剩余定理(非互质)][扩展欧几里得]
- 扩展欧几里得&&中国剩余定理 解线性同余方程组 专题
- poj 2891 Strange Way to Express Integers(扩展欧几里得,中国剩余定理)
- [BZOJ 1951] 古代猪文【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】
- gcd,扩展欧几里得,中国剩余定理
- 扩展欧几里得、逆元、线性同余方程组、中国剩余定理总结
- [BZOJ 1951][Sdoi2010]古代猪文:Lucas定理|中国剩余定理|费马小定理|扩展欧几里得
- 5.扩展欧几里得&&中国剩余定理
- BZOJ_P1951&Codevs_P1830 [SDOI2010]古代猪文(Lucas定理+扩展欧几里得+中国剩余定理)
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- POJ 1006 Biorhythms 中国剩余定理/扩展欧几里得
- 扩展的欧几里得&中国剩余定理
- Strange Way to Express Integers(扩展欧几里得+乘法逆元+中国剩余定理求解非互质的模线性方程组)
- 扩展欧几里得、中国剩余定理 入门指南