P1495 曹冲养猪

题目描述

自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了。如果建造了5个猪圈,但是仍然有1头猪没有地方去,然后如果建造了7个猪圈,还有2头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?

输入输出格式

输入格式:

第一行包含一个整数n (n <= 10) – 建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示建立了ai个猪圈,有bi头猪没有去处。你可以假定ai,aj互质.

输出格式: 输出包含一个正整数,即为曹冲至少养母猪的数目。

首先看到这道题的时候,第一眼就看到了假定ai,aj互质,然后就很容易想到中国剩余定理(想到了也不会写QAQ

就是一道裸的中国剩余定理的板子题

代码如下:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 typedef long long ll;
 6 using namespace std;
 7 ll n, a[11], b[11], ans = 0, cnt = 1;//数组开15会runtime error(在其他评测机上试的就这样QAQ)
 8 void exgcd(ll a, ll b, ll &x, ll &y) {
 9     if(b == 0) {
10         x = 1;
11         y = 0;
12     } else {
13         exgcd(b,a%b,x,y);
14         ll temp = x;
15         x = y;
16         y = temp - a / b * y;
17     }
18 }
19 void china() {
20     ll p, q, x, y;
21     for(ll i = 1; i <= n; i++) {
22         p = cnt / a[i];
23         exgcd(p,a[i],x,y);
24         ans = ((ans + p * x * b[i]) % cnt + cnt) % cnt;
25     }
26 }
27 int main() {
28     scanf("%lld", &n);
29     for(ll i = 1; i <= n; i++) {
30         scanf("%lld %lld", &a[i], &b[i]);
31         cnt *= a[i];
32     }
33     china();
34     printf("%lld\n", ans);
35     return 0;
36 }
View Code

 

posted @ 2019-04-01 21:12  机器闵  阅读(138)  评论(0编辑  收藏  举报