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

      对于求和式 $f(a,b,c,n)=sum_{i=0}^n lfloor frac{ai+b}{c} floor$

      当 $a geq c$ 或 $b geq c$ 时,设 $a'=a ; mod ; c$,$b'=b ; mod ; c$,有

    $$egin{align*} f(a,b,c,n) = & sum_{i=0}^n ; lfloor frac{ai+b}{c} floor \ = & sum_{i=0}^n ; lfloor frac{a'i+b'}{c} floor + lfloor frac{a}{c} floor imes i + lfloor frac{b}{c} floor \ = & ; f(a',b',c,n) + frac{n(n+1)}{2} imes lfloor frac{a}{c} floor + (n+1) imes lfloor frac{b}{c} floor end{align*}$$

      当 $a<c$ 且 $b<c$ 时,设 $m= lfloor frac{an+b}{c} floor$,有

    $$egin{align*} f(a,b,c,n) = & sum_{i=0}^n ; lfloor frac{ai+b}{c} floor \ = & sum_{j=1}^m sum_{i=0}^n ; [ lfloor frac{ai+b}{c} floor geq j ] \ = & sum_{j=0}^{m-1} sum_{i=0}^n ; [ lfloor frac{ai+b}{c} floor geq j+1 ] \ = & sum_{j=0}^{m-1} sum_{i=0}^n ; [ ai geq jc+c-b ] \ = & sum_{j=0}^{m-1} sum_{i=0}^n ; [ ai > jc+c-b-1 ] \ = & sum_{j=0}^{m-1} sum_{i=0}^n ; [ i > lfloor frac{jc+c-b-1}{a} floor ] \ = & sum_{j=0}^{m-1} n- lfloor frac{jc+c-b-1}{a} floor \ = & ; nm - sum_{j=0}^{m-1} ; lfloor frac{jc+c-b-1}{a}  floor \ = & ; nm-f(c,c-b-1,a,m-1) end{align*}$$

      这与欧几里得算法通过取模缩小范围递归的思想相似,时间复杂度为 $O(log ; a)$

    ll f(ll a, ll b, ll c, ll n) {
        if (!a) return b / c * (n + 1);
        if (a < c && b < c) {
            ll m = (a * n + b) / c;
            if (!m) return 0;
            return n * m - f(c, c - b - 1, a, m - 1);
        }
        if (n & 1)
        return f(a % c, b % c, c, n) + (n + 1) / 2 * n * (a / c) + (n + 1) * (b / c);
        return f(a % c, b % c, c, n) + n / 2 * (n + 1) * (a / c) + (n + 1) * (b / c);
    }
    View Code
  • 相关阅读:
    【转载】设计模式_单例模式(学习)
    【转载】设计模式_抽象工厂模式(学习)
    【转载】设计模式_工厂方法(学习)
    【转载】设计模式_六大原则(学习)
    【转载】设计模式_简单工厂模式(学习)
    java有用的启动参数
    linux freetds操作mssql
    ansible 控制windows
    nginx 版本介绍
    tar 压缩去除目录
  • 原文地址:https://www.cnblogs.com/Pedesis/p/11406226.html
Copyright © 2011-2022 走看看