同余-------曹冲养猪

自从曹冲搞定了大象以后,曹操就开始琢磨让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲很不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有 1616

头母猪,如果建了 33

个猪圈,剩下 11

头猪就没有地方安家了;如果建造了 55

个猪圈,但是仍然有 11

头猪没有地方去;如果建造了 77

个猪圈,还有 22

头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?输入格式第一行包含一个整数 nn

,表示建立猪圈的次数;接下来 nn

行,每行两个整数 ai,biai,bi

,表示建立了 aiai

个猪圈,有 bibi

头猪没有去处。你可以假定 ai,ajai,aj

互质。输出格式输出仅包含一个正整数,即为曹冲至少养猪的数目。数据范围1≤n≤101≤n≤10

,
1≤bi≤ai≤11000001≤bi≤ai≤1100000

所有aiai

的乘积不超过 10181018

输入样例:3
3 1
5 1
7

思路:完美套用中国剩余定理,然后要注意因为要输出最小值,所以对M取余

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 10;
int n;
int A[N], B[N];
void exgcd(LL a, LL b, LL &x, LL &y){
 if (!b)   x = 1, y = 0;
 else{
  exgcd(b, a % b, y, x);
  y -= a / b * x;
 }
} 
int main(){
 scanf("%d", &n);
 LL M = 1;
  for (int i = 0; i < n; i ++){
  scanf("%d%d", &A[i], &B[i]);
  M *= A[i];
 }
  LL res = 0;
 for (int i = 0; i < n ; i ++){
  LL Mi;
   Mi = M / A[i];
   LL ti, x;
   exgcd(Mi, A[i], ti, x);
   res += B[i] * Mi * ti;
 }
  cout << (res % M + M) % M << endl;
  return 0;
}
发布了106 篇原创文章 · 获赞 67 · 访问量 5416

猜你喜欢

转载自blog.csdn.net/qq_45772483/article/details/105028059