类欧几里得算法

当我们要计算形如

\[ \sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor \]

且a,b>=0,c>0时
可以使用类欧算法。

首先有以下公式

\[\lceil \frac{a}{b}\rceil = \lfloor \frac{a+b-1}{b}\rfloor \]

\[\lfloor\frac{a}{b}\rfloor = \lceil \frac{a-b+1}{b}\rceil \]

挺容易推的:关于1式,如果 a % b != 0,那么右边就会比左边大1,2式原理相同。

然后开始推(?
我们令

\[F(a,b,c,n)=\sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor \]

\[{a}\geq{c}\Rightarrow\sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor=\sum_{i=0}^n(\lfloor \frac{a\%c\times i+b}{c}\rfloor+\lfloor\frac{a}{c}\rfloor i)=\sum_{i=0}^n\lfloor \frac{a\%c\times i+b}{c}\rfloor+\lfloor\frac{a}{c}\rfloor\frac{n\times (n+1)}{2} \]

\[{b}\geq{c}\Rightarrow\sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor=\sum_{i=0}^n\lfloor \frac{a i+b\% c}{c}\rfloor+\lfloor\frac{b}{c}\rfloor(n+1) \]

因此

\[{a}\geq{c}||{b}\geq{c}\Rightarrow\sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor=\sum_{i=0}^n\lfloor \frac{(a\%c) i+b\% c}{c}\rfloor+\lfloor\frac{b}{c}\rfloor(n+1)+\lfloor\frac{a}{c}\rfloor\frac{n\times (n+1)}{2} \]

\[\Rightarrow F(a,b,c,n) = F(a\%c,b\%c,c,n)++\lfloor\frac{b}{c}\rfloor(n+1)+\lfloor\frac{a}{c}\rfloor\frac{n\times (n+1)}{2} \]

之后只要解决\(a \lt c \&\& b\lt c\)的情况就好了(?

\[\sum_{i=0}^n\lfloor \frac{ai+b}{c}\rfloor =\sum_{i=0}^n\sum_{j=1}^{\lfloor \frac{ai+b}{c}\rfloor}1 =\sum_{i=0}^n\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}[{j\leq \lfloor \frac{ai+b}{c}\rfloor}] \]

交换求和顺序(

\[\Rightarrow \sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}\sum_{i=0}^n[{j\leq \lfloor \frac{ai+b}{c}\rfloor}] \]

又有

\[\lfloor \frac{a}{b} \rfloor \geq c \Leftrightarrow a\geq bc \]

\[\lceil \frac{a}{b} \rceil \leq c \Leftrightarrow a\leq bc \]

因此

\[=\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}\sum_{i=0}^n[jc\leq {ai+b}] =\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}\sum_{i=0}^n[\lceil \frac{jc-b}{a} \rceil \leq i] =\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}[n+1-\lceil \frac{jc-b}{a} \rceil] \]

\[=\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}[n+1-\lfloor \frac{jc-b+a-1}{a} \rfloor] \]

\[=n\lfloor \frac{an+b}{c}\rfloor-\sum_{j=1}^{\lfloor \frac{an+b}{c}\rfloor}[\lfloor \frac{jc-b+a-1}{a} \rfloor-1] =n\lfloor \frac{an+b}{c}\rfloor-\sum_{j=0}^{\lfloor \frac{an+b}{c}\rfloor-1}[\lfloor \frac{(j+1)c-b-1}{a} \rfloor] \]

因此我们有\(a,b\lt c\)

\[F(a,b,c,n)=n\lfloor \frac{an+b}{c}\rfloor-F(c,-1-b+c,a,\lfloor \frac{an+b}{c}\rfloor-1) \]

然后就 可以递归了 终止条件a=0
以下代码

  ll exgcd(ll a, ll b, ll c, ll n){
        if(a==0) return (n+1)*(b/c);
        if(a>=c||b>=c) return exgcd(a%c, b%c, c, n) + floor(a/c)*n*(n+1)/2 + floor(b/c)*(n+1);
        ll temp = (a*n+b)/c;
        return n*temp - exgcd(c, c-b-1, a, temp-1);
  }
posted @ 2020-05-23 10:15  PopHirasawa  阅读(174)  评论(0编辑  收藏  举报