zoukankan      html  css  js  c++  java
  • 类欧几里得算法初步

    考虑计算这样一个函数:

    [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 ]

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

  • 相关阅读:
    Leetcode: Longest Increasing Subsequence
    Leetcode: Bulls and Cows
    Leetcode: Serialize and Deserialize Binary Tree
    undefined reference to symbol '_ZNK11GenICam_3_016GenericException17GetSourceFileNameEv'
    ranlib 作用
    live555运行时报错:StreamParser internal error ( 86451 + 64000 > 150000)
    qt 免注册下载
    modsign: could't get uefi db list
    ubuntu安装 opencv-3.4.3
    xl2tpd[26104]: Maximum retries exceeded for tunnel 33925. Closing
  • 原文地址:https://www.cnblogs.com/Reanap/p/14304002.html
Copyright © 2011-2022 走看看