扩展欧几里得

直线上的点

求直线 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的倍数时,无整数解。

 

posted @ 2019-06-13 20:03  darrrr  阅读(127)  评论(0编辑  收藏  举报