链接:https://ac.nowcoder.com/acm/problem/15068
来源:牛客网
uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?
问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。
这道题必须用扩展中国剩余定理来解决,因为无论模数是否互质都可以满足次定理,即从第二个开始每次对aax+bb=a[i]y+b[i]求最小整数解,之后把每次加上aax,每次对(aa,a[i])求最小公倍数lcm。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<string.h>
#include<vector>
#include<set>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define inf 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
ll a[maxn],b[maxn];
ll r=1;
inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
inline ll ex_CRT(ll a[],ll b[],ll k)
{
ll aa=a[0],bb=[b[0],x,t;
for(int i=1;i<k;i++)
{
ll cc=b[i]-bb,xx,yy;
ll d=exgcd(aa,a[i],x,y);
if(cc%d)return -1;
x*=cc/d,t=a[i],x=(x%t+t)%t;
bb=aa*x+bb,aa=aa/d*a[i],bb%=aa;
}
return (bb%aa+aa)%aa;
}
int main()
{
IOS;
int k;
cin>>k;
for(int i=0;i<k;i++){
cin>>a[i]>>b[i];
}
ll t=ex_CRT(a,b,k);
cout<<t<<endl;
return 0;
}