excrt

前面还有很大很大很大很大很大的坑要填。卖炭翁要变精卫了。。。。

题目描述

给定 nn组非负整数 a_i, b_iai,bi,求解关于 xx的方程组

                                                                                  

的最小非负整数解。

```cpp

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
#define N 100005
ll A[N],B[N];
ll mul(ll x,ll y,ll mod){
ll ret=0;
while(y>0){
if(y&1) ret=(ret+x)%mod;
x=(x+x)%mod;
y>>=1;
}
return ret;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0) {x=1,y=0;return a;}
ll gcd=exgcd(b,a%b,x,y);
ll tmp=x;x=y;y=tmp-a/b*y; return gcd;
}
int n;
inline ll excrt()
{
ll x,y,k;
ll M=B[1],ans=A[1];
for(int i=2;i<=n;++i){
ll a=M,b=B[i],c=(A[i]-ans%b+b)%b;
ll gcd=exgcd(a,b,x,y),bg=b/gcd;
if(c%gcd!=0) return -1;
x=mul(x,c/gcd,bg);
ans+=x*M;
M*=bg;
ans=(ans%M+M)%M;
}
return (ans%M+M)%M;
}
int main()
{
n=read();
for(int i=1;i<=n;i++) B[i]=read(),A[i]=read();
printf("%lld\n",excrt());
}

```cpp

posted @ 2019-02-13 13:12  Cseller  阅读(153)  评论(0编辑  收藏  举报