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 ]

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

  • 相关阅读:
    [php learn] php 从头開始学习1
    Qt实现Windows远程控制
    [core java学习笔记][第十一章异常断言日志调试]
    网络安全-安全散列函数,信息摘要SHA-1,MD5原理
    Cardboard虚拟现实开发初步(二)
    C#中Stack&lt;T&gt;类的使用及部分成员函数的源代码分析
    编程算法
    读取spring配置文件的方法(spring读取资源文件)
    Spring中的事务管理详解
    配置spring事务管理的几种方式(声明式事务)
  • 原文地址:https://www.cnblogs.com/Reanap/p/14304002.html
Copyright © 2011-2022 走看看