您的位置:首页 > 其它

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,即不会破坏前面的成果!


代码如下:

/*
参考别人的代码,欧几里得中国剩余定理
*/

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐