AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 1298. 曹冲养猪    原题链接    中等

作者: 作者的头像   只想白嫖 ,  2022-01-15 16:03:07 ,  所有人可见 ,  阅读 71


1


题目描述

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

举个例子,假如有 16 头母猪,如果建了 3 个猪圈,剩下 1 头猪就没有地方安家了;如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去;如果建造了 7 个猪圈,还有 2 头没有地方去。

你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?

样例

输入格式
第一行包含一个整数 n,表示建立猪圈的次数;

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

你可以假定 ai,aj 互质。

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

数据范围
1≤n≤10,
1≤bi≤ai≤1100000
所有ai的乘积不超过 1018
输入样例:
3
3 1
5 1
7 2
输出样例:
16

中国剩余定理裸题

在这里插入图片描述

参考文献

提高课5.3

C++ 代码

/*
author: A Fei
solution: 同余方程组
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
using namespace std;
int a[11], m[11];
int n;

LL exgcd(LL a, LL b, LL &x, LL &y)
{
    if(!b)
    {
        x = 1, y = 0;
        return a;
    }

    LL d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
int main()
{
    scanf("%d", &n);

    LL M = 1;
    for(int i = 0; i < n; i ++) scanf("%d%d", &m[i], &a[i]), M *= m[i];

    LL res = 0;
    for(int i = 0; i < n; i ++)
    {
        LL mi = M/m[i];
        LL t, y;
        exgcd(mi, (LL)m[i], t, y);
        // t = (t % m[i] + m[i]) % m[i];
        res += (LL)a[i] * t * mi;
    }

    printf("%lld\n", (res % M + M) % M);//对于任意x+kM都是满足要求的解,但目标是输出最小的正整数x,因此取模即可

    return 0;
}

1 评论


用户头像
燚淼叕鑫鱻   7个月前     回复

给个关注呗,本人无条件互粉


你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息