[NOIP 2012 提高组] 同余方程 · 教师题解

[NOIP 2012 提高组] 同余方程

知识点

扩展欧几里得、乘法逆元

解题思路

由ax≡1(mod b)可得ax+by=1。输入保证有解,即gcd(a,b)=1,使用扩展欧几里得求一组x,再将x规范到[0,b-1]即可。由于b≥2且逆元非0,该值就是最小正解。

正确性说明

扩展欧几里得返回满足ax+by=gcd(a,b)的整数系数。有解保证右侧为1,故x是逆元;所有解对b同余,取最小非负余数并且该余数非0,就得到最小正整数解。

易错点

不能仅用费马小定理,因为模数不保证为质数;扩展系数用64位;负数取模后再加b。

复杂度

时间O(log min(a,b)),递归空间同阶。

参考代码(GNU C++17)

#include<bits/stdc++.h>
using namespace std;
long long ex(long long a,long long b,long long&x,long long&y){if(!b){x=1;y=0;return a;}long long u,v,g=ex(b,a%b,u,v);x=v;y=u-a/b*v;return g;}int main(){long long a,b,x,y;cin>>a>>b;ex(a,b,x,y);cout<<(x%b+b)%b<<'\n';}
返回题目