扩展欧几里得算法是:已知整数a, b,找出一对整数(x, y)使得ax+by=gcd(a, b)。
void egcd(int a, int b, int& d, int& x, int& y){ if(b == 0){ d = a; x = 1; y = 0; }else{ egcd(b, a % b, d, y, x); y -= x * (a / b); } }
上面代码计算出了(a, b)的最大公因数并以参数d返回。
直线上的点。求有多少对整数(x, y)满足ax+by+c=0且x∈[x0, x1],y∈[y0, y1]。
首先移项得ax+by=-c。求ax+by=g=gcd(a, b)。设一组解为(x0, y0),当c是g的倍数时原方程一组解为(x0c/g,y0c/g),否则无解。
假设解出了ax + by = c 的(x1, y1)这组解,则其他解为(x1 + ka/g, y1 - kb/g)。最后求出横坐标属于[x1,x2]的S1,且纵坐标属于[y1, y2]范围的S2,求|S1 ∩ S2 ∩ Z|即为答案。