主要介绍扩展欧几里的和总结一些常用性质
首先介绍裴蜀定理
对于任意整数a,b,存在一对整数x,y 满足 ax+by=gcd(a,b)
即存在x0,y0使得ax0+by0=gcd(a,b)
扩展欧几里得可以求出x0,y0
从而当ax+by=c 可以求出其通解
设d=gcd(a,b)
显然当c%d!=0时无整数解
通解可以表示为
x=(c/d)x0+k(b/d)
y=(c/d)y0-k(a/d)
k是同一个整数,取遍整数集合
【】注意,容易记混成x=(c/d)x0+k*b*(c/d)
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int z=x;
x=y;
y=z-(a/b)*y;
return d;
}
下面介绍几个有关性质和细节
1.k为同一个整数,有这样一题,把x和y限制在一个范围里,通过二分k来获取答案。
2.取任一合法x,可以通过ax+by=c来逆推y
3.可以用来解线性同余方程a*x≡b (mod m) 等价于a*x-b=k*m等价于a*x-k*m=b等价于a*x+m*y=b
4.x最小正整数解 ((c/d)*x0%(b/d)+(b/d))%(b/d)
y的最小正整数解((c/d)*y0%(a/d)+(a/d))%(a/d)
本质上是这样的 a+kp>=0 的最小正整数结果是 a%p
举个例子:
-5加若干个3后第一次大于0时是几 答案是1
因为-5%3=1 (一般情况下取模如果结果是负数,那么就再加上这个模数,-5%3=-2 -2+3=1)
所以要想取得(c/d)x0+k(b/d)的最小正整数解,只需要(c/d)x0 对(b/d)取模 ;y同理,需要(c/d)*y0对(a/d)取模
放一个手推exgcd的图,代码忘了可以用这个再推出来,最好记住板子吧