【题目来源】
https://www.luogu.com.cn/problem/P1495
https://www.acwing.com/problem/content/225/
【题目描述】
自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪。可是曹冲满不高兴,于是在工作中马马虎虎。有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有 16 头母猪,如果建了 3 个猪圈,剩下 1 头猪就没有地方安家了。如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去,然后如果建造了 7 个猪圈,还有 2 头没有地方去。你作为曹操的私人秘书理所当然要将准确的猪数报给曹操,你该怎么办?
【输入格式】
第一行包含一个整数n:建立猪圈的次数。
接下来n行,每行两个整数ai、bi,表示建立了ai个猪圈,有bi头猪没有去处。你可以假定a1~an互质。
【输出格式】
输出包含一个正整数,即为曹冲至少养母猪的数目。
【输入样例】
3
3 1
5 1
7 2
【输出样例】
16
【说明/提示】
1≤n≤10,
0≤bi<ai≤100000,
1≤∏ai≤10^18
【算法分析】
● 中国剩余定理应用的充要条件是模数互质(在本题中也就是猪圈数目互质)。
● 中国剩余定理算法步骤
(1)计算模数的乘积:M=m1·m2·…·mk
(2)对每个模数 mi,计算 Mi=M/mi
(3)对每个 Mi,求解 Mi 在模 mi 下的逆元 yi,即满足 Mi·yi≡1(mod mi)
(4)最终解 x 为:x=∑ai·Mi·yi(mod M),i∈(1,k)
其中,ai 是每个同余方程的余数。
● 中国剩余定理应用示例
例题:给定同余方程组: x≡2(mod 3),x≡3(mod 5),x≡2(mod 7) 由于模数 3、5、7 互质,所以可以采用中国剩余定理求解。步骤如下:
(1)计算 M=3×5×7=105。
(2)计算每个 Mi:M1=105/3=35,M2=105/5=21,M3=105/7=15。
(3)计算每个逆元 yi: 对于 M1=35,求解 35·y1≡1(mod 3),得到 y1=2。 对于 M2=21,求解 21·y2≡1(mod 5),得到 y2=1。 对于 M3=15,求解 15·y3≡1(mod 7),得到 y3=1。
(4)求解 x: x=(2×35×2+3×21×1+2×15×1) mod 105 =233 mod 105=23。
【算法代码】
#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N=15;
LL m[N],a[N];LL exgcd(LL a,LL b,LL &x,LL &y) {if(b==0) {x=1,y=0;return a;}LL d=exgcd(b,a%b,y,x);y-=(a/b)*x;return d;
}int main() {int n;cin>>n;LL M=1;for(int i=1; i<=n; i++) {cin>>m[i]>>a[i];M*=m[i];}LL t=0;for(int i=1; i<=n; i++) {LL x,y;LL Mi=M/m[i];exgcd(Mi,m[i],x,y);t=(t+a[i]*Mi%M*x)%M;}t=(t+M)%M;cout<<t<<endl;return 0;
}/*
in:
3
99991 99990
99989 99988
99971 99970out:
282926331270118
*/
【参考文献】
https://www.luogu.com.cn/problem/P1495
https://www.luogu.com.cn/problem/P4777
https://www.acwing.com/problem/content/206/
https://blog.csdn.net/qq_33127317/article/details/108439841
https://www.luogu.com.cn/problem/solution/P1495
https://blog.csdn.net/qq_51352378/article/details/123491047
https://www.acwing.com/solution/content/148128/
https://www.acwing.com/solution/content/164120/