#include <cstdio>
#include <cstring>
#include <vector>
#include<queue>
#include<string>
#include<iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[20],b[20];//a是除数 ,b是余数
ll ans[20];
ll mulmod=1;
ll sum=0;
void exgcd(ll a,ll b,ll &x,ll &y) {
if(!b){
x=1,y=0;
return ;
}
exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*x;
}
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%lld%lld",&a[i],&b[i]);
mulmod*=a[i];
}//计算所有模数的积 mulmod
for(int i=0;i<n;++i){
ans[i]=mulmod/a[i];///计算ans[i]=mulmod/a[i];
ll x,y;
exgcd(ans[i],a[i],x,y);//计算ans[i]在模数a[i]下的逆元 x
sum+=b[i]*ans[i]*(x<0?x+a[i]:x);//方程组唯一解为 sum(ans[i]*x*b[i])
//注意 x可能为负数需要处理
}
printf("%lld",sum%mulmod);
return 0;
}
数论:中国剩余定理
猜你喜欢
转载自blog.csdn.net/qq_45695839/article/details/109551125
今日推荐
周排行