曹冲养猪

题目描述

自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有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 }

 

posted @ 2019-09-07 15:24  GTR_PaulFrank  阅读(246)  评论(0编辑  收藏  举报