题目描述
求关于 xx 的同余方程 的最小正整数解.
算法分析
将同余方程转化为二元一次方程的形式,即由 ax≡1(modb)ax≡1(modb) 转化为 ax−by=1ax−by=1。
使用扩展欧几里得算法求解:
当 b=0b=0 时要满足 ax−by=gcd(a,b)ax−by=gcd(a,b),可得 x=1,y=0x=1,y=0。
当 b≠0b≠0 时,bx0+(amodb)y0=gcd(b,amodb)bx0+(amodb)y0=gcd(b,amodb),将 amodbamodb 用 a−⌊ab⌋×ba−⌊ab⌋×b 表示得到 bx0+(a−⌊ab⌋×b)y0=gcd(b,amodb)bx0+(a−⌊ab⌋×b)y0=gcd(b,amodb),化简得 ay0+b(x0−⌊ab⌋×y0)=gcd(b,amodb)ay0+b(x0−⌊ab⌋×y0)=gcd(b,amodb),则 x=y0,y=x0−⌊ab⌋×y0x=y0,y=x0−⌊ab⌋×y0,以此递归即可。
实现时可将 x,yx,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;
}