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
  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/Pedesis/p/11406226.html
Copyright © 2011-2022 走看看