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 }