对于中国剩余定理的表述:
设m1,m2,m3….mk两两互素,则同余方程组
有整数解。并且在模M=m1*m2*……*mk下的解是唯一的,解为:
这个方程十分关键,用来解题十分方便。
其中Mi=M/m[i],而Mi^-1为Mi模m[i]的逆元。用扩展欧几里得求出,就是求出方程x-k*m[i]=a[i]中的k。
故可以写程序求出x。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
LL p[20], r[20];
void ex_gcd(LL a, LL b, LL &x, LL &y){
if(!b){
x = 1;
y = 0;
return;
}
ex_gcd(b, a%b, x, y);
LL temp = x;
x = y;
y = temp - a/b * y;
}
int main(){
int T, n, kase = 0;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
LL MOD = 1;
for(int i = 0; i < n; i++){
scanf("%lld%lld", &p[i], &r[i]);
MOD *= p[i];
}
LL x, y;
LL ans = 0;
for(int i = 0; i < n; i++){
ex_gcd(MOD/p[i], p[i], x, y);
ans = (ans + MOD/p[i]*x*r[i] + MOD) % MOD;
}
printf("Case %d: %lld\n",++kase, (ans + MOD) % MOD);
}
return 0;
}
#include<bits/stdc++.h>
# define ll long long
using namespace std;
int extend_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int gcd=extend_gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return gcd;
}
int china(int w[],int b[],int k)//b[i]就相当于那个余数
{
int x,y,a=0,m,n=1,i;
for(i=0;i<k;i++)
n*=w[i];
for(i=0;i<k;i++)
{
m=n/w[i];
extend_gcd(w[i],m,x,y);
a=(a+y*m*b[i])%n;
}
if(a>0)return a;
else return a+n;
}
int main()
{
}