vijos p1164——曹冲养猪(中国剩余定理)(复习)

描述

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

格式

输入格式

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

//你可以假定ai,aj互质.

输出格式

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

样例1

样例输入1

3
3 1
5 1
7 2

样例输出1

16
 
 
样例:除以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
",ans%mm);
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/937337156Zhang/p/6071521.html