对数论一无所知的我一开始连式子都看不懂,然后去网上找这个式子的含义。 其实就是说ax%b=1(a,b一定要互质,不然无解的) ax=by+1 ax-by=1 ax+by=1 因为a,b互质,所以ax+by=gcd(a,b)
对于方程ax + by = gcd(a, b);我们设解为x, y
我们令a = b, b = a % b;
得到方程bx + (a % b)y = gcd(b, a % b);
由欧几里得算法可以得到gcd(a, b) = gcd(b, (a % b));
代入可得:bx +( a % b )y = gcd(a, b)
设此方程解为x1, y1;
在计算机中我们知道: a % b = a - (a / b) * b;
代入方程化解得:
ay1 + b(x1 - (a / b) y1) = gcd(a, b);
与ax + by = gcd(a, b) 联立,我们很容易得:
x = y1, y = x1- (a / b)y1
然后我们就这样可以解出来了。
明显要用递归来推这个式子的解,当b=0 时,只有x=1,y=0才能使a1+b0=gcd(a,0)
由此我们把ax + by = 1的其中一组解解出来了, 仅仅是其中一组解。
按着这个意思我们就可以写出exgcd的代码了!!!
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
int x1,y1;
exgcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
}
however
这个方程的x是会解出负解的,然而我们要求的是最小正整数解,我们将如何应对!!?? 从别处学到了这种操作,如下
printf("%d",(x+b)%b);
没错,输出答案就这样输出就行了 原题 P1082 (一个晚上加上同学的解释才稍微搞懂了一些,然而感觉还是半懂不懂的,还要继续理解啊.....)