曹冲养猪
题目描述
自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了。如果建造了5个猪圈,但是仍然有1头猪没有地方去,然后如果建造了7个猪圈,还有2头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?
输入格式
第一行包含一个整数n (n <= 10) – 建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示建立了ai个猪圈,有bi头猪没有去处。你可以假定ai,aj互质.
输出格式
输出包含一个正整数,即为曹冲至少养母猪的数目。
输入输出样例
输入 #1
3
3 1
5 1
7 2
输出 #1
16
【解题思路】
这是一道中国剩余定理(孙子定理)的裸模板题
【code】
1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 using namespace std;
5 long long n,x,y;
6 long long ans,N;
7 long long a[15],b[15];
8 inline long long Exgcd(long long a,long long b,long long &x,long long &y){
9 if(b==0){
10 x=1;
11 y=0;
12 return a;
13 }
14 long long gcd=Exgcd(b,a%b,x,y);
15 long long t=x;
16 x=y;
17 y=t-a/b*y;
18 return gcd;
19 }
20 inline long long IntChina(long long k){
21 long long N=1;
22 for(register int i=1;i<=k;i++)
23 N*=a[i];
24 for(register int i=1;i<=k;i++){
25 long long m=N/a[i];
26 Exgcd(m,a[i],x,y);
27 ans=((ans+b[i]*m*x)%N+N)%N;
28 }
29 return ans;
30 }
31 int main(){
32 scanf("%lld",&n);
33 for(register int i=1;i<=n;i++)
34 scanf("%lld%lld",&a[i],&b[i]);
35 printf("%lld\n",IntChina(n));
36 return 0;
37 }