题意:
直线上的点。求直线ax+by+c=0上有多少个整点(x,y)满足x∈[x1,x2],y∈[y1,y2]
扩展欧几里得算法:
求ax + by = gcd(a,b)解
void gcd(int a,int b,int& d,int& x,int& y)
{
if(!b) {d = a;x = 1;y = 0;}
else {gcd(b,a%b,d,y,x);y -= x*(a/b);}
}
求出来的x1和y1是一组解
设另外一组解x2和y2,则有:a * x1 + b * y1 = a * x2 + b * y2
变形为: a(x1 - x2) = b(y2 - y1),当俩边同时除以gcd(a,b)后
那么可以得出结论:(x1 - x2) 一定为b的整数倍,(y2 - y1)也一定为a的整数倍
所以有:y2-y1 = k * a/gcd(a,b)
所以推导出:
设a,b,c为任意整数。若方程ax + by = c的一组解为(x0,y0),那么任意整数解都可以写成
(x0 + k * b/gcd(a,b) , (y0-k * a/gcd(a,b)) )
求出一组特解很容易,直接先使得c为1,然后就可以利用扩展欧几里得求出一组特解然后再用公式即可
(只有当c为gcd(a,b)的倍数的时候才有整数解)
如果要求逆元的话,那么有方程ax %b == 1%b
a是要求逆元的那个数,b是模数,那么也就恒等为:
ax + b*y == 1 也就是可以exgcd(a,b,x,y) 求出来的也就是x也就是a的逆元。