扩展欧几里德算法:
应用:
①求解不定方程
②求解同余方程
③求解模的逆元
看欧拉定理看吐了也还是有超级~~多的题目不会做,看的有晕又困!难受,看会别的压压惊~~希望拓展欧几里德的题目能对我稍稍稍稍稍稍的友好点~~
拓展欧几里得定理最初的贝祖定理是,如果a、b是整数,那么一定存在x、y,使ax+by=gcd(a,b),换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。
即如果ax+by=1,那么ab一定互质,gcd(a,b)=1。
那么只要求出最大公约数就能知道到底可不可以成立啦~~
巴特!身为一个优秀的学生,我们必须知道的不是是否有解而是解是多少,这就迫使我们需要去寻找ax+by与最大公约数的关系,经过大佬们严密的推算,得出 x = y1 , y = x1 – a/b*y1,这就是我们利用拓展欧几里得算法的中心公式哒!大佬博客在这里!
模板大大:
int gcd(int a,int b,int &x,int &y)
{
if (b == 0)
{
x = 1,y = 0;
return a;
}
int ans = e_gcd(b,a%b,x,y);
int tmp = x;
x = y;
y = tmp - a/b*y;
}
这里求出来的就是特解x0,y0,对于ax+by=d来说,x增加b/d,y减少a/d等式一直成立(x增加了a*b/d,y增加了a*b/d,都是变化了一个最小公倍数),所以鸭,只要按着这个最小公倍数的方法变化,就可以得到其他所有的解啦(无论是x最小还是y最小),所以通解公式如下:
x = x0 + (b/gcd)*t;
y = y0 - (a/gcd)*t;
更一般来说,如果不知道d与ab的最小公约数的关系,可以现用d%gcd(a,b)!=0,那么等式无解,否则如果d% gcd(a,b) == 0 且d / gcd(a,b) = t,那么求出方程 a * x + b * y = gcd(a,b)的所有解x,y,将x,y乘上t,对应的x’,y’即是方程a * x + b * y = t * gcd(a,b)的解!
拓展欧几里得呵呵哒不过如此 lv_1
*UVA10104 Euclid Problem 终于看见令人感动的模板题了!
拓展欧几里得还是有点点让人头秃的呜呜呜 lv_8
*HDU1576 A/B 大概最基本的题目,其他的题目都比他难了吧,可能算一道入门提,由于我太菜,不可能放进第一个题目下了,很惭愧。我第一眼想到的是用乘法逆元,本来以为我又想错了思路,再仔细一想,其实大概拓展欧几里得就是可以求乘法逆元??(不过我是由费马小定理求的这个乘法逆元就是了hhh,实在想试试拓展欧几里得也不是不可以鸭~~)
*UVALive6428 A+B 普通模板题目~~公式给的十分露骨,符合上文的更一般情况的题目……坑点在于a、b、s可能是0。
*1352 集合计数 大概是,不知道是拓展欧几里得的题目的话,就不可能知道它该怎么做了吧!(知道了我也不会嘤嘤嘤~),知道了之后也有一个特别的步骤,那就是求集合数,怎么求呢?就是求出x最小时y的大小,以及y最小时x大小,两个x相减的值就是集合数目啦~~
*poj 1061 青蛙的约会 也算是一个很经典的题目了,第一次看的印象还在~~详情……还是翻8月20八九的训练日记吧
*bzoj 2242: [SDOI2011]计算器 三个公式:
1、给定y,z,p,计算Y^Z Mod P 的值;
2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;
3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。
第一个公式显然快速幂,第二个公式显然拓展欧几里得,第三个是一个高阶同余方程,是要用到GSBS算法的,不过也是一个模板题就是辽~~模板不好背哇~~
* poj 2115 C looooops 这个公式的列出是难点。再就是求最小x的时候用的是一个很新颖的方法(因为那个循环减去b/d的方法太耗时啦~~,就先是求出了这个公式的解x、y,再利用了:
b=b/gcd(a,b);
printf("%lld\n",(x%b+b)%b);
求得最小的整数解x~~y的话呀,利用ax+by=c来带入求值呀。
*SGU 106 The equation 比起拓展欧几里得改进了一点点,不过难度也仅限于这个范围了,因为它直接告诉了你公式,相当于直接提示用拓展欧几里得做了。(需要特判a=0/b=0/a=b=c=0/a=b=0等特殊情况)
由于x=x0+b/gcd(a,b)*t;给出x的范围,进而就可以求出x有几对了。(可以用(x2-x)/(b/d)求出还可以增加几部分,减少类似,求得增加中x与y较少的,减少中x与y更大的,然后相减(如果用x-x1就相加)得出结果~~
*Codeforces Beta Round #7 C.Line 也是告诉了公式,要求的是x+y大于零的对数。不知道为什么不需要判断这个,可能所有的情况都满足?反正写上特判也不算很多时间吧~~~
拓展欧几里得哥求你放过我!! lv_0