文章目录
题256.洛谷P1495 中国剩余定理-【模板】中国剩余定理(CRT)/曹冲养猪
一、关于中国剩余定理CRT
1.概述
2.算法步骤
二、题目
三、题解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+1;
ll a[maxn],b[maxn];
ll ex_gcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll ans=ex_gcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return ans;
}
ll CRT(ll a[],ll b[],int N)
{
ll n=1;
for(int i=0;i<N;i++)//得到所有除数的乘积
{
n*=a[i];
}
ll res=0;
for(int i=0;i<N;i++)
{
ll m=n/a[i];//得到a[i]以外所有的除数的倍数m
ll mm,y;
//利用扩欧求m的逆元mm
ex_gcd(m,a[i],mm,y);
mm=(mm%a[i]+a[i])%a[i];//最小正整数x为(x%b/gcd(a,b)+b/gcd(a,b))%b/gcd(a,b)
res=(res%n+m*mm*b[i]%n)%n;//线性同余方程组的唯一解res为(m*mm*余数)求和
}
return res;
}
int main()
{
int N;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>a[i]>>b[i];
}
ll res=CRT(a,b,N);
cout<<res;
}