考虑计算这样一个函数:
[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
]
手推好像有一点萎,先咕咕咕。