还记得我初一的时候还没听说过exgcd,看到这道题,咦,这不就是不定方程吗,
于是推了一个小时,推出一个类似exgcd的东西,本质一样
以下 /表示取整的除(div)
ax−by=c
x=aby+c=a(b%a)y+c+b/a⋅y
因为 x为整数, b/a⋅y为整数,所以 (b%a)y+c能被a整除
不妨设 ay′=(b%a)y+c
则 (b%a)y−ay′=−c
若 gcd(a,b,c)表示满足 ax−by=c的其中一个 x
那么, y=gcd(b%a,a,−c)
把 y代入原式,得到 gcd(a,b,c)=x=aby+c=ab⋅gcd(b%a,a,−c)+c
#####曾经的代码(pascal,满满的回忆啊):
var a,b:int64;
function gcd(a,b,c:int64):int64;
begin
if (a=0)or(b=0) then exit(1);
exit((gcd(b mod a,a,-c)*b+c) div a);
end;
begin
readln(a,b);
writeln((gcd(a,b,1)) mod b);
end.
#####现在的代码都是这样了
#include<bits/stdc++.h>
int a,b,x,y;
void ex_gcd(int a,int b,int &x,int &y){
if (!b) x=1,y=0;
else ex_gcd(b,a%b,y,x),y-=a/b*x;
}
int main(){
scanf("%d%d",&a,&b);
ex_gcd(a,b,x,y);
printf("%d",(x+b)%b);
}