Rt.
(注释里是 WA 掉的数据)
70pts:
//CRT 模板
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
const int maxn=1e2+10;
ll n,a[maxn],m[maxn],M_=1,M[maxn],p[maxn],q,ans;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*y;
return b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>m[i]>>a[i];
for(int i=1;i<=n;i++)M_*=m[i];
for(int i=1;i<=n;i++)M[i]=M_/m[i];
for(int i=1;i<=n;i++)exgcd(M[i],m[i],p[i],q);
for(int i=1;i<=n;i++)ans+=M[i]*p[i]*a[i]%M_,ans%=M_;
cout<<ans%M_;
return 0;
}
/*
3
3 1
5 1
7 2
*/
加上了 __int128 后:
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
const int maxn=1e2+10;
ll n,a[maxn],m[maxn],M_=1,M[maxn],p[maxn],q;
__int128 ans;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*y;
return b;
}
void print(__int128 x){
if(x==0)return;
print(x/10);
cout<<(int)(x%10);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>m[i]>>a[i];
for(int i=1;i<=n;i++)M_*=m[i];
for(int i=1;i<=n;i++)M[i]=M_/m[i];
for(int i=1;i<=n;i++)exgcd(M[i],m[i],p[i],q);
cout<<"M_ : "<<M_<<"\n";
for(int i=1;i<=n;i++){
// cout<<"---> "<<ans<<"\n";
ans+=M[i]*p[i]*a[i]%M_;
ans%=M_;
}
ans%=M_;
print(ans);
return 0;
}
/*
3
99991 99990
99989 99988
99971 99970
*/
输出都不利索了