ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b==0)
{
x=1;
y=0;
return a;
}
ll r=exgcd
ll t=x;
x=y;
y=t-a/b*y;
}
int main() {
ll x, y;
exgcd (a, p, x, y);
x = (x % p + p) % p;
printf ("%d\n", x); //x是a在mod p下的逆元
}
中国剩余定理模板
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=3e5+5;
/*
ll dp[maxn][6],ww[maxn];
int n;
string s;
char a[]={"wrong"};
int main(){
cin >> n >> s;
for(int i = 1; i <= n; i++)
cin >> ww[i];
memset(dp, 0, sizeof dp);
rep(i,1,n){
rep(j,1,5){
ll minn =INF;
for(int k = 1; k < j; k++)
minn = min(minn, dp[i-1][k]);
if(s[i-1] == a[j-1] && j!=1)
dp[i][j] = min(minn, dp[i-1][j] + ww[i]);
else if(s[i-1] == a[j-1])
dp[i][j] = dp[i-1][j] + ww[i];
else
dp[i][j] = dp[i-1][j];
}
}
cout<<min({dp[n][1],dp[n][2],dp[n][3],dp[n][4],dp[n][5]});
return 0;
}
*/
ll b[maxn],a[maxn],ans,n,M,x;
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){ x=1; y=0; return;}
exgcd(b,a%b,x,y);
int tp=x;
x=y; y=tp-a/b*y;
}
int crt()
{
int ans=0,lcm=1,x,y;
for(int i=1;i<=n;++i) lcm*=b[i];
for(int i=1;i<=n;++i)
{
int tp=lcm/b[i];
exgcd(tp,b[i],x,y); //M[i] m[i]
x=(x%b[i]+b[i])%b[i];//x要为最小非负整数解 逆元
ans=(ans+tp*x*a[i])%lcm; //M[i]*逆元*余数
}
return (ans+lcm)%lcm;
}
int main() {
cin>>n;
rep(i,1,n){
cin>>b[i]>>a[i]; //模 余数
}
ans=crt();
cout<<ans<<endl;
}
/*
3
3 2
5 3
7 2
*/