以前对其理解有误,由于其和中国剩余定理有一定相似的地方,写这篇文章开始将其命名为中国剩余定理的不互质情况,为了与中国剩余定理区分,将这篇正式更名为解一元线性同余方程组,这样或许更加严谨一点。过几天再写真正的中国剩余定理。
代码部分参考HIT出版的《数论及其应用》
#include <cstdio>
using namespace std;
typedef long long ll;
void Ext_Gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b){
x=1;
y=0;
d=a;
}
else
{
Ext_Gcd(b,a%b,d,x,y);
ll t=x;
x=y;
y=t-a/b*y;
}
}
int main()
{
ll n;
while(~scanf("%I64d",&n)){
bool ifhave=true;
ll a1,r1,a2,r2;
scanf("%I64d%I64d",&a1,&r1);
for(ll i=1;i<n;i++)
{
scanf("%I64d%I64d",&a2,&r2);
ll a=a1,b=a2,c=r2-r1,d,x,y;
Ext_Gcd(a,b,d,x,y);
if(c%d) ifhave=false;
ll t=b/d;
x=x*c/d;
x=(x%t+t)%t;
r1=a1*x+r1;
a1=a1/d*a2;
}
if(ifhave) printf("%I64d\n",r1);
else printf("-1\n");
}
return 0;
}