自从曹冲搞定了大象以后,曹操就开始琢磨让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲很不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有 1616
头母猪,如果建了 33
个猪圈,剩下 11
头猪就没有地方安家了;如果建造了 55
个猪圈,但是仍然有 11
头猪没有地方去;如果建造了 77
个猪圈,还有 22
头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?输入格式第一行包含一个整数 nn
,表示建立猪圈的次数;接下来 nn
行,每行两个整数 ai,biai,bi
,表示建立了 aiai
个猪圈,有 bibi
头猪没有去处。你可以假定 ai,ajai,aj
互质。输出格式输出仅包含一个正整数,即为曹冲至少养猪的数目。数据范围1≤n≤101≤n≤10
,
1≤bi≤ai≤11000001≤bi≤ai≤1100000
所有aiai
的乘积不超过 10181018
输入样例:3
3 1
5 1
7
思路:完美套用中国剩余定理,然后要注意因为要输出最小值,所以对M取余
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 10;
int n;
int A[N], B[N];
void exgcd(LL a, LL b, LL &x, LL &y){
if (!b) x = 1, y = 0;
else{
exgcd(b, a % b, y, x);
y -= a / b * x;
}
}
int main(){
scanf("%d", &n);
LL M = 1;
for (int i = 0; i < n; i ++){
scanf("%d%d", &A[i], &B[i]);
M *= A[i];
}
LL res = 0;
for (int i = 0; i < n ; i ++){
LL Mi;
Mi = M / A[i];
LL ti, x;
exgcd(Mi, A[i], ti, x);
res += B[i] * Mi * ti;
}
cout << (res % M + M) % M << endl;
return 0;
}