普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?
这种情况就采用两两合并的思想,假设要合并如下两个方程
那么得到
在利用扩展欧几里得算法解出的最小正整数解,再带入
得到后合并为一个方程的结果为
这样一直合并下去,最终可以求得同余方程组的解。
附上代码“
#include <iostream>
#include <stdio.h>
typedef long long ll;
using namespace std;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
x=1;
y=0;
d=a;
return;
}
exgcd(b,a%b,d,x,y);
ll temp=x;
x=y;
y=temp-(a/b)*y;
}
int main()
{
ll n,a1,r1,a2,r2;
ll d,x0,y0;
while(cin>>n)
{
cin>>a1>>r1;
int ishave=1;
for(int i=1;i<n;i++)
{
cin>>a2>>r2;
ll a=a1;
ll b=a2;
ll c=r2-r1;
exgcd(a,b,d,x0,y0);
if(c%d)
{
ishave=0;
}
ll t=b/d;
x0=(x0*(c/d)%t+t)%t;
r1=r1+a*x0;
a1=a1*(a2/d);
}
if(!ishave)
{
printf("-1\n");
continue;
}
printf("%lld\n",r1);//这种算法求得的r1就是最小正整数
}
return 0;
}