类欧几里得算法
当我们要计算形如
\[ \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);
}
K-ON!!