【题目】
题目描述:
一个正整数 ,给出 对一些质数取模的结果,求符合条件的最小的 。
例如, , , 。符合条件的最小的 。
输入格式:
第 行: 个数 表示后面输入的质数及模的数量。( )
第 ~ 行,每行 个数 和 ,中间用空格分隔, 是质数, 是 的结果。
输出格式:
输出符合条件的最小的 。数据中所有 均小于 。
样例数据:
输入
3
2 1
3 2
5 3
输出
23
【分析】
如题,这是一道 CRT 的模板题。
具体的做法就看我的这篇博客中国剩余定理。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a[15],m[15],M[15];
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b) {x=1,y=0;return;}
exgcd(b,a%b,y,x),y-=a/b*x;
}
int main()
{
int n,i;
scanf("%d",&n);
ll x,y,ans=0,num=1;
for(i=1;i<=n;++i)
scanf("%lld%lld",&m[i],&a[i]),num*=m[i];
for(i=1;i<=n;++i)
{
M[i]=num/m[i];
exgcd(M[i],m[i],x,y);
x=(x+m[i])%m[i];
ans+=a[i]*M[i]*x;
}
printf("%lld",ans%num);
return 0;
}