最熟悉的一个概念,最大公约数gcd,$k/m$ 表示$k$能除尽$m$

注意“$k$能除尽$m$”和“$m$是$k$的倍数”并不完全一样,如$k=0$

$gcd(m, n) = max\left \{k \mid k/m\ and\ k/n \right \};$ ①

欧几里德算法的递归形式:

$gcd(0, n) = n;$ $gcd(m, n) = gcd(n%m, m); m > 0$ ②

还有一种扩展形式:

$xm + yn = gcd(m, n);$

这个x,y得出有个很美妙的递归求法。

假定 $n>m>=0,x_1m + y_1n = gcd(m, n);$

1)当$m=0$时,$x_1=0,y_1=1$是它其中的一组可能解。

2)假设 $r=n%m$,则有 $gcd(r, m) = x_2r + y_2m;$

根据②可知 $gcd(r, m) = gcd(m, n);$

则有 $x_1m + y_1n = x_2r + y_2m;$ ③

因为 $r = n%m = n - [n/m]m;$

③可得 $x_1m + y_1n = x_2(n - [n/m]m) + y_2m = x_2n + (y_2 - [n/m]x_2)m;$

则有解 $y_1 = x_2; x_1 = y_2 - [n/m]x_2;$

可以看出$x_2$, $y_2$交叉赋值给$y_1$, $x_1$。

这样就得到了扩展欧几里德算法。

// extended_euclid(m, n) = mx + ny
int extended_euclid(int m, int n, int &x, int &y)
{
    if(m == 0) {
        x = 0;
        y = 1;
        return n;
    }
    int gcd = extended_euclid(n%m ,m ,y ,x);
    x -= n/m * y;
    return gcd;
}

还有个公式就是

$$\sum a_m=\sum a_{n/m}\ (n > 0, m/n)$$

还不大清楚它的用途,下次碰到了再看下吧。