版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37275680/article/details/82631201
Input示例
3 2 1 3 2 5 3Output示例
23
对于孙子定理的写法尚不理解,姑且先这样写吧。
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
//扩展欧几里得算法
void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(b==0){
d=a;
x=1,y=0;
}
else{//else不能省略
gcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}
//中国剩余定理
ll China(int n,ll *m,ll *a)
{
ll M=1,d,y,x=0;
for(int i=0;i<n;i++) M*=m[i];
for(int i=0;i<n;i++){
ll w=M/m[i];
gcd(m[i],w,d,d,y);
x=(x+y*w*a[i])%M;
}
return (x+M)%M;
}
int main()
{
ll n,p[15],m[20];
scanf("%lld",&n);
for(int i=0;i<n;i++)
scanf("%lld%lld",&p[i],&m[i]);
printf("%lld",China(n,p,m));
return 0;
}