扩展欧几里得算法

扩展欧几里得算法是:已知整数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|即为答案。

posted @ 2016-10-12 16:55  张瑯小强  阅读(137)  评论(0编辑  收藏  举报