洛谷P1082 同余方程

还记得我初一的时候还没听说过exgcd,看到这道题,咦,这不就是不定方程吗,
于是推了一个小时,推出一个类似exgcd的东西,本质一样
以下 / 表示取整的除(div)
a x b y = c
x = b y + c a = ( b % a ) y + c a + b / a y
因为 x 为整数, b / a y 为整数,所以 ( b % a ) y + c a
不妨设 a y = ( b % a ) y + c
( b % a ) y a y = c
g c d ( a , b , c ) 表示满足 a x b y = c 的其中一个 x
那么, y = g c d ( b % a , a , c )
y 代入原式,得到 g c d ( a , b , c ) = x = b y + c a = b g c d ( b % a , a , c ) + c a

曾经的代码(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);
}

深入学习

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80946756