这里简单说下中国剩余定理,去掉过程和证明。
首先,这是解,ai是余数,M是所有模pi的乘积,Mi是M除以pi,ti是Mi的逆元,即 (Mi *ti)mod pi
=1。
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long int ll;
int n,t,k;
int p[20],r[20];
ll x,y;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll r=ex_gcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll M=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i],&r[i]);
M*=p[i];
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ll m=M/p[i];
ll a=ex_gcd(m,p[i],x,y);
ans=(ans+r[i]*m*x)%M;
}
printf("Case %d: %lld\n",++k,(ans%M+M)%M);//注意这里要处理负数,使其变为正数而且是最小解
}
return 0;
}