还记得我初一的时候还没听说过exgcd,看到这道题,咦,这不就是不定方程吗,
于是推了一个小时,推出一个类似exgcd的东西,本质一样
以下
表示取整的除(div)
因为
为整数,
为整数,所以
不妨设
则
若
表示满足
的其中一个
那么,
把
代入原式,得到
曾经的代码(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);
}