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;
}
相关推荐
王景程16 分钟前
什么是哈希函数
算法·哈希算法
会不再投降21924 分钟前
《算法复杂度:数据结构世界里的“速度与激情”》
数据结构·算法
kaiaaaa1 小时前
算法训练第十五天
开发语言·python·算法
Coovally AI模型快速验证1 小时前
SLAM3R:基于单目视频的实时密集3D场景重建
神经网络·算法·3d·目标跟踪·音视频
Once_day2 小时前
代码训练LeetCode(29)最后一个单词的长度
算法·leetcode·c
凌肖战2 小时前
力扣上C语言编程题:最大子数组和(涉及数组)
c语言·算法·leetcode
蒟蒻小袁2 小时前
力扣面试150题--除法求值
算法·leetcode·面试
客卿1232 小时前
力扣hot100--反转链表
算法·leetcode·链表
wangjialelele2 小时前
动态内存管理之柔性数组
数据结构·算法