EH's Blog

题目情境#

题目描述

给定 a,b,ma,b,m,求解同余方程 ax≡b(modm)ax\equiv b\pmod m。

说明/提示

本页为算法笔记。

算法解析:#

exgcd 求逆元:ax≡b(modm)ax\equiv b\pmod m 即 ax+my=bax+my=b。用扩展欧几里得求 ax+my=gcd⁡(a,m)ax+my=\gcd(a,m) 的特解,若 bb 能被 gcd⁡\gcd 整除则 x=b/d⋅x0 mod mx=b/d\cdot x_0\bmod m 为解,否则无解。当 b=1b=1 时即求 aa 的乘法逆元。

image-20250808150258351

时间复杂度:O(logn){O(logn)}

C++代码实现#

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
    
int exgcd(int a,int b,int &x,int &y){
  if(b == 0){x = 1, y = 0; return a;}
  int x1, y1, d;
  d = exgcd(b, a%b, x1, y1);
  x = y1, y = x1-a/b*y1;
  return d;
}
int main(){
  int a, b, m, x, y;
  scanf("%d%d%d", &a, &b, &m);
  int d = exgcd(a, m, x, y);
  if(b%d == 0) 
    printf("%d", 1ll*x*b/d%m);
  else puts("none");
  return 0;
}
c
G11 拓展欧几里得-乘法逆元
https://ehnotgod.site/zh/blog/g11-%E6%8B%93%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97-%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83
Author EH
Published at August 8, 2026