数论:中国剩余定理

#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