#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001],b[1000001],x,y;
void exgcd(long long a,long long b,long long &d,long long &xx,long long &yy){
if(b==0){xx=1;yy=0;d=a;}
else{
exgcd(b,a%b,d,xx,yy);
long long k=xx;
xx=yy;yy=k-a/b*yy;
}
}
long long cheng(long long aa,long long bb,long long mm){
long long ss=0;
while(bb>0){
if(bb&1) ss=(ss+aa)%mm;
aa=(aa+aa)%mm;
bb>>=1;
}
return (ss%mm+mm)%mm;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>a[1]>>b[1];
long long m=a[1],ans=b[1];
for(int i=2;i<=n;i++){
long long d;
cin>>a[i]>>b[i];
//ans+km=b[i](mod a[i])
//km=(b[i]-ans)mod a[i]
b[i]=(b[i]-ans%a[i])%a[i];
exgcd(m,a[i],d,x,y);
if(b[i]%d!=0){
for(int j=i+1;j<=n;j++) cin>>a[i]>>b[i];
cout<<"-1";
return 0;
}
ans+=(cheng(x,b[i]/d,a[i])+a[i])%a[i]*m;
m=m/d*a[i];
ans=(ans%m+m)%m;
}
cout<<ans;
return 0;
}
写了快速乘只剩46分了......
这是原来的78分
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000001],b[1000001],x,y;
void exgcd(long long a,long long b,long long &d,long long &xx,long long &yy){
if(b==0){xx=1;yy=0;d=a;}
else{
exgcd(b,a%b,d,xx,yy);
long long k=xx;
xx=yy;yy=k-a/b*yy;
}
}
int main(){
cin>>n>>a[1]>>b[1];
long long m=a[1],ans=b[1];
for(int i=2;i<=n;i++){
long long d;
cin>>a[i]>>b[i];
//ans+km=b[i](mod a[i])
//km=(b[i]-ans)mod a[i]
b[i]=(b[i]-ans%a[i])%a[i];
exgcd(m,a[i],d,x,y);
if(b[i]%d!=0){
for(int j=i+1;j<=n;j++) cin>>a[i]>>b[i];
cout<<"-1";
return 0;
}
ans+=(x*(b[i]/d)%a[i]+a[i])%a[i]*m;
m=m/d*a[i];
ans=(ans%m+m)%m;
}
cout<<ans;
return 0;
}
救救孩子吧......