【中国剩余定理详解】题解 P1495 【曹冲养猪】
中国剩余定理详解
中国剩余定理是一种用于求解诸如
形式的同余方程组的定理,其中,
一、解法:
至于古人是怎么发现这个算法的,感兴趣的可以自行了解,在此不再赘述()
我们设
其中
显然,
我们可以构造出一个解
由此,任意解
最小正整数解
Notice:
有人可能会问,
仔细看,这里
二、证明:
其实证明这种东西,搞不搞懂都无所谓
易证,在第
因为
因此,
三、逆元:
若
求解逆元的方法主要有如下三种,本篇只介绍使用扩展欧几里得的方法,其余方法各位可自行了解。
1、费马小定理,限制
2、欧拉定理。
3、扩展欧几里得
扩展欧几里得用于在已知
标准思路:
下式(不知道的,可以设
又因为
所以
故原方程中
此外,在开篇的方程组中,我们要求的是
四、题解:
“如果建了 3个猪圈,剩下 1头猪就没有地方安家了。”
同余方程十分明显:
猪的总数
#include<cstdio>
#define ll long long
ll n,a[16],m[16],Mi[16],mul=1,X;
inline int rd(){
int io=0;char in=getchar();
while(in<'0'||in>'9')in=getchar();
while(in>='0'&&in<='9')io=(io<<3)+(io<<1)+(in^'0'),in=getchar();
return io;
}
void exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){x=1;y=0;return ;}
exgcd(b,a%b,x,y);
int z=x;x=y,y=z-y*(a/b);
}
int main(){
n=rd();
for(int t=1;t<=n;++t){
int M=rd();m[t]=M;
mul*=M;
a[t]=rd();
}
for(int t=1;t<=n;++t){
Mi[t]=mul/m[t];
ll x=0,y=0;
exgcd(Mi[t],m[t],x,y);
X+=a[t]*Mi[t]*(x<0?x+m[t]:x);
}
printf("%lld",X%mul);
return 0;
}