扩展欧几里得
直线上的点
求直线 ax + by + c = 0 上有多少个整点( x , y ) 满足 x ∈ [ x1 , x2] , y ∈ [ y1 , y2 ] 。
扩展欧几里得算法
ax + by = gcd(a,b)
求(x,y)
void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) d = a , x = 1 , y = 0 ; else { exgcd(b,a%b,d,y,x); y -= x * (a / b) ; } }
一组解为(u , v)
任取另外一组解为(n , m)
那么 au + bv = an + bm;
变形得 a(u - n) = b(m - v)
假设g = gcd(a,b)
方程左右两边同时除以g
得a`(u - n) = b`(m - v)
其中 a` = a / g , b`= b / g;
注意,此时a` 和 b` 互质
因此 u - n 一定是 b` 得整数倍
设它为 kb`,
计算得 m - v = ka`
因此可以得出如下结论
- 设 a,b,c 为任意整数。若方程ax + by = c的一组整数解为(x,y),则它的任意整数解都可以写成(x + kb` , y - ka`);其中a`=a/gcd(a,b) , b`=b/gcd(a,b) ,k取任意整数。
于是得出如如下结论
- 设 a,b,c 为任意整数,g= gcd(a,b),方程 ax + by = g的一组解是(x,y)
- 则当c是g的倍数时,ax+by=c的一组解是(xc/g,yc/g);
- 当c不是g的倍数时,无整数解。