vijos p1164——曹冲养猪(中国剩余定理)(复习)
描述
自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了。如果建造了5个猪圈,但是仍然有1头猪没有地方去,然后如果建造了7个猪圈,还有2头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?
格式
输入格式
第一行包含一个整数n (n <= 10) – 建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示建立了ai个猪圈,有bi头猪没有去处。
//你可以假定ai,aj互质.
输出格式
输出包含一个正整数,即为曹冲至少养母猪的数目。
样例:除以3余1,除以5余1,除以7余2。考虑中国剩余定理。
怎样才能满足一个条件,且不影响其它其他条件呢?
先将a[i]连乘,在考虑第i个条件时,将连乘的值除掉当前值,这样增加一定是其他条件的倍数,不会影响条件。
枚举j,求当除掉当前值后的值乘j,看是否余上当前a[i]为1。得到j后,直接乘上b[i]次就得出了余上a[i]为b[i]的值。ans开longlong累加。
祝自己NOIP考试顺利~
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 using namespace std;
5 long long b[11],m[11],Mi[11],M[11];
6 int main()
7 {
8 int n;
9 while(scanf("%d",&n)==1)
10 {
11 long long mm=1;
12 for(int i=1;i<=n;i++)
13 {
14 scanf("%I64d%I64d",&m[i],&b[i]);
15 mm*=m[i];
16 }
17 long long ans=0;
18 for(int i=1;i<=n;i++)
19 {
20 M[i]=mm/m[i];
21 for(long long j=1;j<100000;j++)
22 if(j*M[i]%m[i]==1)
23 {
24 Mi[i]=j;
25 break;
26 }
27 ans+=Mi[i]*M[i]*b[i];
28 }
29 printf("%I64d\n",ans%mm);
30 }
31 return 0;
32 }