类欧几里得算法初步

考虑计算这样一个函数:

[f(a , b , c , n) = sum_{i=0}^{n} lfloor frac{a imes i + b}{c} floor ]

带向下取整的式子,我们一般考虑整除分块的做法,但对于这个式子显然不太好做,我们考虑其他做法。

首先考虑 (c le a) 或者 (c le b) 的情况。

比较简单可以得到:

[f(a , b , c , n) = sum_{i=0}^{n} lfloor frac{(lfloor frac{a}{c} floor imes c + a mod c) imes i + lfloor frac{b}{c} floor + b mod c}{c} floor ]

[f(a , b , c , n) = frac{n imes (n + 1)}{2} imes lfloor frac{a}{c} floor + (n + 1) imes lfloor frac{b}{c} floor + f(a mod c , b mod c , c , n) ]

现在考虑化简 (a < c) 并且 (b < c) 的情况。

我们的目标是将 (c) 变小,从而使得式子上述情况能被反复使用。

有一个很简单的性质:

[x = sum_{i=1}^{x} lbrack i leq x brack ]

所以,我们可以把我们的函数化成大概这个样子:

[f(a , b , c , n) = sum_{i=0}^{n} lfloor frac{a imes i + b}{c} floor ]

[f(a , b , c , n) = sum_{i=0}^{n} sum_{k} [k leq lfloor frac{a imes i + b}{c} floor] ]

[f(a , b , c , n) = sum_{i=0}^{n} sum_{k} [lfloor frac{k imes c - b}{a} floor < i] ]

[f(a , b , c , n) = sum_{k} sum_{i=0}^{n} [lfloor frac{k imes c - b}{a} floor < i] ]

这里考虑进行容斥,将式子化成与最初类似的形式:

[f(a , b , c , n) = sum_{k} (n - sum_{i=1}^{n} [i leq lfloor frac{k imes c - b - 1}{a} floor]) ]

考虑继续化简,我们发现当 (k) 足够大时,即(n leq lfloor frac{k imes c - b - 1}{a} floor)结果必为 (0)

所以我们令:

[frac{k imes c - b - 1}{a} < n ]

即:

[k < frac{a imes n + b + 1}{c} ]

因为 (k) 为整数,所以有:

[k leq lfloor frac{a imes n + b}{c} floor ]

因此我们令 (P = lfloor frac{a imes n + b}{c} floor)

则:

[f(a , b , c , n) = n imes P - sum_{k=1}^{P}sum_{i=1}^{n} [i leq lfloor frac{k imes c - b - 1}{a} floor]) ]

[f(a , b , c , n) = n imes P - sum_{k=1}^{P} lfloor frac{k imes c - b - 1}{a} floor ]

[f(a , b , c , n) = n imes P - sum_{k=0}^{P-1} lfloor frac{k imes c + c - b - 1}{a} floor ]

[f(a , b , c , n) = n imes P - f(c , c - b - 1 , a , P - 1) ]

至此,该式子已经可以在 $log $ 级别的时间内解决本问题。

现在这里有两个拓展:

[g(a , b , c , n) = sum_{i=0}^{n} i imes lfloor frac{a imes i + b}{c} floor ]

[h(a , b , c , n) = sum_{i=0}^{n} lfloor frac{a imes i + b}{c} floor ^ 2 ]

手推好像有一点萎,先咕咕咕。

原文地址:https://www.cnblogs.com/Reanap/p/14304002.html