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;
}
相关推荐
To_OC9 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_8414956410 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒14 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽17 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米17 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠17 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA19 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel19 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客19 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化