AcWing 203. 同余方程

AcWing 203. 同余方程

一、题目描述

求关于 x 的同余方程 ax1 (mod b)最小正整数解

输入格式
输入只有一行,包含两个正整数 a,b,用一个空格隔开。

输出格式
输出只有一行,包含一个正整数 x,表示最小正整数解。

输入数据保证一定有解。

数据范围
2a,b2×109

输入样例

3 10

输出样例

7

样例解读:37%10=1,此时7是最小正整数解

二、解题思路

线性同余方程模板题

因为题目说一定有解。根据裴蜀定理,线性同余方程 axb(mod m)有解,当且仅当gcd(a,m)|b

回到本题,就是 gcd(a,b)=1,对照通用形式ax+my=b,上面的方程对位改写为 ax+by=1

解释:

通用式 axb(mod m)ax+my=b

本题式 ax1 (mod b)ax+by=1

使用扩欧解题两步走

  • 用扩展欧几里得算法求出方程ax+by=1的一组解(x0,y0)
  • x0 mod b,转移到 1b 区间内即可

注意

  • long long
  • C++ 中的取模较为特殊,要用 (x%b+b)%b 代码进行取模

三、实现代码

#include <cstdio>
using namespace std;
typedef long long LL;
//快读
char buf[1 << 23], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main() {
    int a = read(), b = read();

    int x, y;
    exgcd(a, b, x, y);
    printf("%d\n", ((LL)x % b + b) % b);
    return 0;
}
posted @   糖豆爸爸  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-05-24 Rabbitmq异常排查
2018-05-24 2、Centos6 安装tomcat8.5.31
2018-05-24 1 、在Linux(centos6.8)系统下的JDK安装与配置
Live2D
点击右上角即可分享
微信分享提示