洛谷 P1082:[NOIP 2012 提高组] 同余方程 ← 求逆元
【题目来源】
https://www.luogu.com.cn/problem/P1082
【题目描述】
求关于 x 的同余方程 ax≡1(mod b) 的最小正整数解。
【输入格式】
一行,包含两个整数 a,b,用一个空格隔开。
【输出格式】
一个整数 x0,即最小正整数解。输入数据保证一定有解。
【输入样例】
3 10
【输出样例】
7
【算法分析:扩展欧几里得算法与模逆元】
● 理论基础 → 裴蜀定理指出:若整数 a 和 b 互质(即 gcd(a,b)=1),则存在整数 x 和 y,使得 ax+by=1。此时,x 即为 a 模 b 的乘法逆元,即满足 ax≡1(mod b)。
● 求解步骤
(1)验证互质性:计算 gcd(a,b),若结果不为 1,则逆元不存在。
(2)扩展欧几里得算法:解方程 ax+by=1,得到的 x 即为逆元(需调整为正数)。
● 调整结果:若 x 为负数,通过 (x mod T + T) mod T 调整为最小正整数解,其中 T=b/gcd(a,b) 为解的周期。
【算法代码】
注意:此算法代码,适用于 a,b≤10^6 时的情形。详见:https://blog.csdn.net/hnjzsyjyj/article/details/147805062
#include <bits/stdc++.h>
using namespace std;int exgcd(int a,int b,int &x,int &y) {if(b==0) {x=1,y=0;return a;}int d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}int inv(int a,int b) {int x,y;exgcd(a,b,x,y);return (x%b+b)%b; //Ensure inverse is positive.
}int main() {int a,b;cin>>a>>b;cout<<inv(a,b)<<endl;return 0;
}/*
in:
3 10out:
7
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/147673627
https://blog.csdn.net/hnjzsyjyj/article/details/147805062
https://blog.csdn.net/hnjzsyjyj/article/details/147804004
https://blog.csdn.net/hnjzsyjyj/article/details/147778571