AC通道:http://vjudge.net/problem/POJ-2891
【题目大意】
给出k个模方程组:x mod ai = ri。求x的最小正值。如果不存在这样的x,那么输出-1.
【题解】
模板题,练习剩余定理的模板
/*************
POJ 2891
by chty
2016.11.3
*************/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 100000
typedef long long ll;
ll n,a[MAXN],m[MAXN];
inline ll read()
{
ll x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b) {x=1; y=0; return a;}
ll r=exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
return r;
}
ll China()
{
ll A=a[1],M=m[1],k,y;
for(ll i=2;i<=n;i++)
{
ll g=exgcd(M,m[i],k,y),da=a[i]-A;
if(da%g) return -1;
ll t=m[i]/g;
k*=da/g;
k=(k%t+t)%t;
A+=k*M;
M=M*m[i]/g;
A=(A+M)%M;
}
return A;
}
int main()
{
freopen("cin.in","r",stdin);
freopen("cout.out","w",stdout);
while(~scanf("%lld",&n))
{
for(ll i=1;i<=n;i++) m[i]=read(),a[i]=read();
printf("%lld\n",China());
}
return 0;
}