AcWing 223. 阿九大战朱最学——扩展欧几里得算法

题目来源

223. 阿九大战朱最学 - AcWing题库

题目描述

自从朱最学搞定了 QQ 农场以后,就开始捉摸去 QQ 牧场干些事业,不仅在自己的牧场养牛,还到阿九的牧场放牛!

阿九很生气,有一次朱最学想知道阿九牧场奶牛的数量,于是阿九想狠狠耍朱最学一把。

举个例子,假如有 1616 头奶牛,如果建了 33 个牛棚,剩下 11 头牛就没有地方安家了。

如果建造了 55 个牛棚,但是仍然有 11 头牛没有地方去,然后如果建造了 77 个牛棚,还有 22 头没有地方去。

你作为阿九的私人秘书理所当然要将准确的奶牛数报给阿九,你该怎么办?

输入格式

第一行包含一个整数 n表示建立牛棚的次数。

接下来 n行,每行两个整数 ai,bi,表示建立了 ai 个牛棚,有 bi 头牛没有去处。

你可以假定不同 ai 之间互质。

输出格式

输出包含一个正整数,即为阿九至少养奶牛的数目。

数据范围

1≤n≤101≤≤10,

1≤ai,bi≤12000001≤1200000,

所有 ai 的乘积不超过 10121012。

输入样例:
复制代码
3
3 1
5 1
7 2
输出样例:
复制代码
16

算法分析

中国剩余定理的经典题;

这道题可以列出方程组,只需计算

其步骤为:

1.计算模数的乘积:M=m1m2......mk;

2.对每个模数mi,计算Mi=M/mi;

3.对每个Mi求解Mi在模mi的逆元yi,即满足Mi*yi同余1模mi;

4.最终解x为:x=∑ai*Mi*yi(mod M),i∈(1,k),其中ai是每个同余方程的余数

Code

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
 
typedef long long LL;
const int N=1005;
LL m[N],a[N];
 
LL exgcd(LL a,LL b,LL &x,LL &y) {//十年Oi一场空,不开longlong见祖宗
    if(b==0) {
        x=1,y=0;
        return a;
    }
    LL d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;
    return d;
}
 
int main() {
    int n;
    cin>>n;
    LL M=1;
    for(int i=1; i<=n; i++) {
        cin>>m[i]>>a[i];
        M*=m[i];
    }
 
    LL t=0;
    for(int i=1; i<=n; i++) {
        LL x,y;
        LL Mi=M/m[i];
        exgcd(Mi,m[i],x,y);
        t=(t+a[i]*Mi%M*x)%M;//按照分析过程进行处理
    }
    t=(t+M)%M;
    cout<<t<<endl;
 
    return 0;
}
相关推荐
代码游侠3 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472464 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy4 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异4 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653234 小时前
分布式系统安全通信
开发语言·c++·算法
天天爱吃肉82185 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
alphaTao6 小时前
LeetCode 每日一题 2026/2/2-2026/2/8
算法·leetcode
甄心爱学习6 小时前
【leetcode】判断平衡二叉树
python·算法·leetcode
颜酱6 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
不知名XL6 小时前
day50 单调栈
数据结构·算法·leetcode