题目没说互质,所以用不了中国剩余定理。
通过数学归纳法:
假设前面的几个方程组成的方程组的通解为
k
∗
t
+
r
,
k
为
任
意
整
数
.
k*t+r,k为任意整数.
k∗t+r,k为任意整数.
则接下来的这一步对于输入的两个数
a
,
b
a,b
a,b我们要找
k
∗
t
+
r
≡
b
(
m
o
d
a
)
k*t+r\equiv b\pmod a
k∗t+r≡b(moda)
即
k
∗
t
+
r
+
l
∗
a
=
b
的
整
数
解
k*t+r+l*a=b的整数解
k∗t+r+l∗a=b的整数解
可以用一次Exgcd来求出特殊解一个,再将
t
t
t赋为
a
/
gcd
(
a
,
t
)
a/\gcd(a,t)
a/gcd(a,t),就表示为了通解的形式,可以判断下一组。如果中途有一个方程无解则输出-1
以及 务必注意取模问题!
代码
#include<iostream>
#include<cstdio>
using namespace std;
bool mark;
void Exgcd(long long x,long long y,long long g,long long &d,long long &a,long long &b)
{
if(!y)
{
if(g%x!=0)mark=true;
a=g/x,b=0,d=x;
return;
}
Exgcd(y,x%y,g,d,b,a);
b-=(x/y)*a;
}
long long gcd(long long x,long long y)
{
if(!y)return x;
return gcd(y,x%y);
}
int main()
{
long long k;
while(scanf("%lld",&k)!=EOF)
{
mark=false;
long long u,v;
u=1,v=0;
long long ans;
while(k--)
{
long long x,y;
scanf("%lld%lld",&x,&y);
if(mark)continue;
long long a,b,d;
Exgcd(x,u,y-v,d,a,b);
d=x/d;
b=(b%d+d)%d;
// printf("%lld %lld %lld %lld %lld\n",x,u,y-v,a,b);
v=b*u+v;
u=x*u/gcd(u,x);
v=(v%u+u)%u;
// printf("#%lld %lld\n",u,v);
}
if(mark)printf("-1\n");
else printf("%lld\n",(v%u+u)%u);
}
return 0;
}