【拓展欧几里得】——理解
typedef long long LL; //一种写法(申博版): LL exgcd(LL a,LL b,LL &x,LL &y) { LL d; if(b==0) { x=1; y=0; return a; } d=exgcd(b,a%b,y,x);//一定要返回 y=y-a/b*x; return d; } d:解得个数 关于exgcd:这个函数的返回值是三个:x,y,d;(视a,b为定值) 但是:不可能写成:return x,y,d; 于是:就用引用的办法去返回数值。 那么,这个函数是什么意思呢? 就是去找出在直线:ax+by+c=0;这条直线上的 坐标为整数的解。 即:d=gcd(a,b)=ax+by; //另一种更加直观(统一)的写法: void exgcd(LL a,LL b,LL &d,LL &x,LL &y) { if(b==0) //这里返回的是:a=ax+by; { d=a; x=1; y=0; } else //这里计算的是:d’= gcd(b,a%b) // d‘= bx’+(a%b)y‘ //即: d = gcd(a,b) = d’= gcd(b,a%b) { exgcd(b,a%b,d,y,x); y=y-a/b*x; } } 两个结论: 1、 a,b,c为任意整数, 若方程:ax+by=c 的一组整数解为(x0,y0); 则:它的任意整数解为:(x0+kb’,y0-ka‘) (k属于Z) 其中:a’=a/gcd(a,b) ; b‘=b/gcd(a,b) ; 2、 a,b,c为任意整数, g=gcd(a,b); 方程:ax+by=c 的一组整数解为(x0,y0); 则:当c是g的倍数时,ax+by=c 的一组解是;(x0c/g,y0c/g)。 否则该方程无整数解。
几何意义:
考虑不定方程:ax+by=1(a,b互质)它等价于同余式ax≡1(mod b),一般来说当a,b确定求x,y的一组解时要用到拓展欧几里得,
下面尝试运用几何方法得到x y的一组解
建 立直角坐标系,原点为O,取点A坐标为(a,b)(a,b意义前面已给出),连接AO。因为a,b互质,所以线段AO除端点外肯定不经过任何一个整点 (横纵坐标都是整数的点)
现在将直线AO竖直向上平移,当遇到第一个整点时停止平移,此时整点的横纵坐标x,y即为所求x ,y的解
证明:设第一个碰上的点为P,连接AP,PO,AO,则△APO面积为0.5.
为什么呢?由于三角形内部显然没有整点,边上的整点只有A,P,O三个顶点而已,由皮克定理可得S△APO=0+3/2-1=0.5
皮克定理:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。
显然△APO还要和x,y,a,b扯上关系才行,知道叉乘公式的童鞋可能已经想到了,向量OP=(x,y)向量OA=(a,b)则三角形的面积等于(OP×OA)/2=(ax+by)/2=0.5
所以ax+by=1满足上式
补充博客:http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html

浙公网安备 33010602011771号