题目:
题解:
是模数不互质的情况了,看来是扩展剩余定理。
代码:
#include <cstdio>
#define LL long long
#define N 1005
using namespace std;
LL c[N],m[N];
LL gcd(LL a,LL b)
{
if (b) return gcd(b,a%b);
else return a;
}
void exgcd(LL a,LL b,LL &x,LL &y)
{
if (!b) x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
int main()
{
int k,i;LL x,y;
while (scanf("%d",&k)!=EOF)
{
bool fff=1;
for (i=1;i<=k;i++) scanf("%lld%lld",&m[i],&c[i]);
for (i=2;i<=k;i++)
{
LL m1=m[i-1],m2=m[i],c1=c[i-1],c2=c[i];
LL t=gcd(m1,m2);
exgcd(m1/t,m2/t,x,y);
x=(x+m[i])%m[i];
if (!x) x+=m[i];
m[i]=m1*m2/t;
if ((c2-c1)%t!=0){fff=0;break;}
c[i]=(x*(c2-c1)/t%(m2/t)*m1+c1)%m[i];
c[i]=(c[i]+m[i])%m[i];
}
if (!fff) printf("-1\n");else printf("%lld\n",c[k]);
}
}
一开始不太明白d-e中c的转变
变成简单的字母吧:abc%ad 为什么等于 a(bc%d)
但是其实可以很简单的证明y=abc-adk=a(bc-dk)