题目描述
求关于
x
的同余方程
ax≡1(modb)
的最小正整数解.
算法分析
将同余方程转化为二元一次方程的形式,即由
ax≡1(modb)
转化为
ax−by=1
。
使用扩展欧几里得算法求解:
当
b=0
时要满足
ax−by=gcd(a,b)
,可得
x=1,y=0
。
当
b≠0
时,
bx0+(amodb)y0=gcd(b,amodb)
,将
amodb
用
a−⌊ab⌋×b
表示得到
bx0+(a−⌊ab⌋×b)y0=gcd(b,amodb)
,化简得
ay0+b(x0−⌊ab⌋×y0)=gcd(b,amodb)
,则
x=y0,y=x0−⌊ab⌋×y0
,以此递归即可。
实现时可将
x,y
的调用位置互换,以不必使用格外的临时变量。
代码实现
#include <cstdio>
typedef long long int ll;
void exgcd(ll a,ll b,ll &x,ll &y) {
if(b==0) {x=1;y=0;}
else {
exgcd(b,a%b,y,x);
y-=a/b*x;
}
}
int main() {
ll a,b;scanf("%lld%lld",&a,&b);
ll x,y;exgcd(a,b,x,y);
printf("%lld\n",(x%b+b)%b);
return 0;
}