中国剩余定理
没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?)
这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=。=至于怎么想到这种构造方法的……去问孙子去→_→
//Vijos 1164
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*=sign;
}
typedef long long LL;
/*******************tamplate********************/ void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
if(!b){ d=a; x=; y=; }
else { exgcd(b,a%b,d,y,x); y-=x*(a/b); }
}
LL china(int n,int *a,int *m){
LL M=,d,y,x=;
F(i,,n) M*=m[i];
F(i,,n){
LL w=M/m[i];
exgcd(m[i],w,d,d,y);
x=(x+y*w*a[i])%M;
}
return (x+M)%M;
}
int a[],b[];
int main(){
int n=getint();
F(i,,n) a[i]=getint(),b[i]=getint();
printf("%lld\n",china(n,b,a));
return ;
}