互质
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int Chinese_Remainder(int mod[],int prime[],int len)
{
int i,d,x,y,m,n,ret;
ret=0,n=1;
for(int i=0;i<len;i++) n*=prime[i];
for(int i=0;i<len;i++)
{
m=n/prime[i];
d=exgcd(prime[i],m,x,y);
ret=(ret+y*m*mod[i])%n;
}
return (n+ret%n)%n;
}
int main()
{
int n,i;
int mod[15],prime[15];
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
scanf("%d%d",&prime[i],&mod[i]);
printf("%d\n",Chinese_Remainder(mod,prime,n));
}
return 0;
}
非互质
#include<bits/stdc++.h>
using namespace std;
#define LL __int64
const LL maxn=20;
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b)
{
d=a;
x=1,y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
LL Chinese_Remainder(LL n,LL a[],LL b[])
{
LL m1,r1,m2,r2,flag=0,i,d,x,y,c,t;
m1=a[0],r1=b[0];
flag=0;
for(int i=1;i<n;i++)
{
m2=a[i],r2=b[i];
if(flag) continue;
exgcd(m1,m2,d,x,y);
c=r2-r1;
if(c%d)
{
flag=1;
continue;
}
t=m2/d;
x=(c/d*x%t+t)%t;
r1=m1*x+r1;
m1=m1*m2/d;
}
if(flag) return -1;
if(n==1&&r1==0) return m1;
return r1;
}
int main()
{
LL T,i,n,tt=0;
LL a[maxn],b[maxn];
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
cout<<"Case "<<++tt<<":"<<Chinese_Remainder(n,a,b)<<endl;
}
return 0;
}