教练给我们布置了一道题目。我觉得和 P4777 几乎是一样的,除了多测和判无解。可是在洛谷能 AC 的代码。那儿只有 30 分。难道是我无解判错了吗?求帮助。
#include<cstdio>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int n;
ll a[MAXN],r[MAXN];
ll exgcd(ll a,ll b,ll &x,ll &y) {
if(b==0) {
x=1;
y=0;
return a;
}
ll ans=exgcd(b,a%b,y,x);
y-=a/b*x;
return ans;
}
ll guisucheng(ll a,ll b,ll mod) {
ll ans=0;
while(b>0) {
if(b%2==1)
ans=(ans+a)%mod;
b/=2;
a=(a+a)%mod;
}
return ans;
}
ll EXCRT() {
ll ans,m,x,y;
ans=r[1];
m=a[1];
for(int i=2;i<=n;i++){
ll b=((r[i]-ans)%a[i]+a[i])%a[i];
ll gcd=exgcd(m,a[i],x,y);
if(b%gcd!=0)
return -1;
x=guisucheng(x,b/gcd,a[i]);
ans+=m*x;
m*=a[i]/gcd;
ans=(ans+m)%m;
}
return ans;
}
int main() {
while(scanf("%d",&n)==1) {
for(int i=1;i<=n;i++)
scanf("%lld %lld",&a[i],&r[i]);
printf("%lld\n",EXCRT());
}
return 0;
}