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
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/Pedesis/p/11406226.html
Copyright © 2011-2022 走看看