题目描述
自从曹冲搞定了大象以后,曹操就开始琢磨让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲很不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。
举个例子,假如有 16 头母猪,如果建了 3 个猪圈,剩下 1 头猪就没有地方安家了;如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去;如果建造了 7 个猪圈,还有 2 头没有地方去。
你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?
输入格式
第一行包含一个整数 n,表示建立猪圈的次数;
接下来 n 行,每行两个整数 ai,bi,表示建立了 ai 个猪圈,有 bi 头猪没有去处。
你可以假定 ai,aj 互质。
输出格式
输出仅包含一个正整数,即为曹冲至少养猪的数目。
数据范围
1≤n≤10,
1≤bi≤ai≤1100000
所有ai的乘积不超过 1018
输入样例
3
3 1
5 1
7 2
输出样例:
16
算法
中国剩余定理简单应用
C++ 代码
#include<iostream>
using namespace std;
const int N=15;
typedef long long LL;
LL M[N],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;
M[0]=1;
for(int i=1;i<=n;i++)
{
cin>>m[i]>>a[i];
M[0]*=m[i];
}
LL res=0;
for(int i=1;i<=n;i++)
{
M[i]=M[0]/m[i];
LL x=0,y=0;
exgcd(M[i],m[i],x,y);
x=(x%m[i]+m[i])%m[i];
res=(res+a[i]*M[i]*x)%M[0];
}
cout<< res <<endl;
return 0;
}