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

    学习背景

    之前做了一道类欧+(Stern-Brocot Tree)二分的题目,就学一下。

    问题模型

    [egin{aligned} f(n,a,b,c) &= sum_{i=0}^{n} leftlfloor frac{ai+b}{c} ight floor \ g(n,a,b,c) &= sum_{i=0}^{n} i leftlfloor frac{ai+b}{c} ight floor \ h(n,a,b,c) &= sum_{i=0}^{n} left(leftlfloor frac{ai+b}{c} ight floor ight)^2 end{aligned} ]

    解法推导

    为了方便,我们设(m= leftlfloor frac{na+b}{c} ight floor)
    注意,因为取模符号太宽了,所以用C++的"%"来表示取模。

    (一)(f(n,a,b,c))

    • 第一种情况:(a<c)(b<c)
      这个可以直接推导,比较简单。

    [egin{aligned} f(n,a,b,c) &= sum_{i=0}^{n} leftlfloor frac{ai+b}{c} ight floor \ &= sum_{i=0}^{n} sum_{j=0}^{n} left[j < leftlfloor frac{ai+b}{c} ight floor ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} left[j < leftlfloor frac{ai+b}{c} ight floor ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} left[j < leftlceil frac{ai+b-c+1}{c} ight ceil ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} left[j < frac{ai+b-c+1}{c} ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} left [cj < ai+b-c+1 ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} left[ i> frac{cj+c-b-1}{a} ight] \ &= sum_{j=0}^{m-1} n - leftlfloor frac{cj+c-b-1}{a} ight floor \ &= nm - sum_{j=0}^{m-1} leftlfloor frac{cj+c-b-1}{a} ight floor \ &= nm - f(m - 1, c, c - b - 1, a) end{aligned} ]

    • 第二种情况:(ageq c)(bgeq c)
      这时候我们只要将(leftlfloor frac{ai+b}{c} ight floor)拆开,就是:

    [egin{aligned} f(n,a,b,c) &= sum_{i=0}^{n} leftlfloor frac{ai+b}{c} ight floor \ &= sum_{i=0}^{n} left( leftlfloor frac{(a \% c)i+(b \% c)}{c} ight floor + i leftlfloor frac{a}{c} ight floor + leftlfloor frac{b}{c} ight floor ight) \ &= frac{n(n+1)}{2} leftlfloor frac{a}{c} ight floor + n leftlfloor frac{b}{c} ight floor + sum_{i=0}^{n} leftlfloor frac{(a \% c)i+(b \% c)}{c} ight floor end{aligned} ]

    (二)(g(n,a,b,c))

    第二类和第一类比较类似,就写得简单一点。

    • 第一种情况:(a<c)(b<c)

    [egin{aligned} g(n,a,b,c) &= sum_{i=0}^{n} i leftlfloor frac{ai+b}{c} ight floor \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} i left[ leftlfloor frac{ai+b}{c} ight floor > j ight] \ &= sum_{j=0}^{m-1} sum_{i=0}^{n} i left[ i > leftlfloor frac{cj+c-b-1}{a} ight floor ight] \ &= frac{mn(n+1)}{2} - sum_{j=0}^{m-1} frac{leftlfloor frac{cj+c-b-1}{a} ight floor (leftlfloor frac{cj+c-b-1}{a} ight floor+1)}{2} \ &= frac{mn(n+1)}{2} - frac{1}{2} sum_{j=0}^{m-1} left( leftlfloor frac{cj+c-b-1}{a} ight floor ight)^2 - frac{1}{2} sum_{j=0}^{m-1} leftlfloor frac{cj+c-b-1}{a} ight floor \ &= frac{mn(n+1)}{2} - frac{1}{2}h(n,c,c-b-1,a) - frac{1}{2}f(n,c,c-b-1,a) end{aligned} ]

    • 第二种情况:(ageq c)(bgeq c)
      这个也和(f(n,a,b,c))类似,直接给出结论了:

    [ g(n,a,b,c) = frac{n(n+1)(2n+1)}{6}leftlfloor frac{a}{c} ight floor + frac{n(n+1)}{2}leftlfloor frac{b}{c} ight floor + g(n,a \% c, b \% c, c) ]

    (三)(h(n,a,b,c))

    因为这里涉及到了平方,所以我们考虑用一种求和式表示平方。

    [ n^2 = 2sum_{i=0}^{n} i - n ]

    之后,有如下推导:

    • 第一种情况:(a<c)(b<c)

    [ h(n,a,b,c) = sum_{i=0}^{n} left( 2sum_{j=0}^{left lfloorfrac{ai+b}{c} ight floor}j - leftlfloorfrac{ai+b}{c} ight floor ight) ]

    之后,就用与求(f)(g)类似的方法,得到:

    [ h(n,a,b,c) = nm(m+1) - 2g(m-1,c,c-b-1,a) - 2f(m-1,c,c-b-1,a) - f(n,a,b,c) ]

    • 第二种情况:(ageq c)(bgeq c)
      对于这个,就直接将三项式暴力拆开,就有:

    [egin{aligned} h(n,a,b,c) = leftlfloor frac{a}{c} ight floor^2 imes frac{n(n+1)(2n+1)}{6} + leftlfloor frac{b}{c} ight floor^2 imes (n+1) + leftlfloor frac{a}{c} ight floor imes leftlfloor frac{b}{c} ight floor imes n(n+1) + h(n,a \% c, b \% c, c) + 2leftlfloor frac{a}{c} ight floor g(n,a \% c, b \% c, c) + 2leftlfloor frac{b}{c} ight floor f(n,a \% c, b \% c, c) end{aligned} ]

    (四)整理一下

    [f(n,a,b,c) = egin{cases} frac{n(n+1)}{2} leftlfloor frac{a}{c} ight floor + n leftlfloor frac{b}{c} ight floor + f(m-1, a \% c, b \% c, c) & a < c And b < c \ nm - f(m - 1, c, c - b - 1, a) & otherwise end{cases} ]

    [g(n,a,b,c) = egin{cases} frac{mn(n+1)}{2} - frac{1}{2}h(n,c,c-b-1,a) - frac{1}{2}f(n,c,c-b-1,a) & a < c And b < c \ frac{n(n+1)(2n+1)}{6}leftlfloor frac{a}{c} ight floor + frac{n(n+1)}{2}leftlfloor frac{b}{c} ight floor + g(n,a \% c, b \% c, c) & otherwise end{cases} ]

    [h(n,a,b,c) = egin{cases} h(n,a,b,c) = nm(m+1) - 2g(m-1,c,c-b-1,a) - 2f(m-1,c,c-b-1,a) - f(n,a,b,c) & a < c And b < c \ leftlfloor frac{a}{c} ight floor^2 imes frac{n(n+1)(2n+1)}{6} + leftlfloor frac{b}{c} ight floor^2 imes (n+1) + leftlfloor frac{a}{c} ight floor imes leftlfloor frac{b}{c} ight floor imes n(n+1) + h(n,a \% c, b \% c, c) + 2leftlfloor frac{a}{c} ight floor g(n,a \% c, b \% c, c) + 2leftlfloor frac{b}{c} ight floor f(n,a \% c, b \% c, c) & otherwaise end{cases} ]

  • 相关阅读:
    微服务-01
    Java 类加载机制
    数据库&缓存
    JVM&GC
    MyBatis
    spring
    mysql技术内幕-读书笔记
    mysql CookBook -读书笔记
    从根上理解mysql-读书笔记
    高性能mysql-读书笔记
  • 原文地址:https://www.cnblogs.com/tacmon52818/p/12713101.html
Copyright © 2011-2022 走看看