//中国剩余定理
//求解 模质数同余方程的问题可用
//模板
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,m[105],a[105],lcm=1;//m为每个方程模的质数,a为余数,lcm公倍数
//扩展欧几里得定理
int exgcd(int a,int b,int &x,int &y)
{
if(!b){ //递归当b==0时返回
x = 1;
y = 0;
return a;
}
int re = exgcd(b,a%b,x,y),temp = y;
y = x - (a/b)*y;
x = temp;
return re;
}
//中国剩余定理
int China()
{
int d,x,y,re = 0;
for(int i = 1;i<=n;i++) lcm = lcm*m[i];
for(int i =1;i<=n;i++)
{
int k = lcm/m[i];
d = exgcd(k,m[i],x,y);
x = (x%m[i]+m[i])%m[i];
re = (re+a[i]*x*k)%lcm;
}
return re;
}
int main()
{
scanf("%d",&n);
for(int i =1;i<=n;i++) scanf("%d%d",&m[i],&a[i]);
printf("%d",China());
return 0;
}
中国剩余定理模板
最新推荐文章于 2021-07-18 15:34:07 发布