问题引入:直线上的点,求直线ax+by+c=0上有多少整点(x, y)满足x∈[x1, x2],y∈[y1, y2]。
首先学习扩展欧几里德算法。找出一对整数(x, y),使得ax+by=gcd(a, b)。
算法程序:
void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d) {
if (!b) {d = a, x = 1, y = 0;}
else {
extend_Eulid(b, a % b, y, x, d);//x和y位置变化
y -= x * (a / b);//x,y为一组解
}
}
上面可求出一组解(x1, y1),求其他解(x2,y2):
则:ax1+by1=ax2+by2 变形: a(x1-x2)=b(y2-y1)
然后左右同除以gcd(a,b) 则a' b'互素所以 x1-x2一定是b'的整数倍 设为kb' 则 y2-y1 = ka'
所以可得以下结论:
设a, b, c为任意整数。若方程ax+by=c的一组整数解为(x0, y0),则它的任意整数解都可以写成(x0+kb', y0-ka')
其中 a' = a / gcd(a, b),b' = b / gcd(a, b), k取任意整数。
此时开头的问题:移项得ax+by=-c,求出一组解即可。
最终结论:
设a,b,c为任意整数,g = gcd(a, b),方程ax+by=g的一组解是(x0,y0),则
1.当c是g的倍数时ax+by=c的一组解是(x0c/g,y0c/g);
2.当c不是g的倍数时无整数解。