首先
我们设mod表示取模(%)
我们设[]表示当括号内判断条件为真则退出1,否则退出0
关于欧几里得
对于b<>0 满足:gcd(a,b)=gcd(b,a % b)
证明与时间复杂度不多说了吧?
复杂度证明贴上,看不懂也不怪我了。
关于类欧几里得
这个实际上是用欧几里得的时间复杂度与计算方法来弄的一种奇妙的算法。
我们看一道题:
求:∑d=1n(−1)⌊d∗r∗d⌋\sum_{d=1}^{n}(-1)^{\lfloor \sqrt{d*r*d} \rfloor}∑d=1n(−1)⌊d∗r∗d⌋
那么,我们可以发现,只要确定⌊d∗r∗d⌋{\lfloor \sqrt{d*r*d} \rfloor}⌊d∗r∗d⌋是不是偶数即可。
那么原式就转化为:∑d=1n⌊r∗d/2⌋mod2\sum_{d=1}^{n}\lfloor \sqrt{r}*d/2 \rfloor mod 2∑d=1n⌊r∗d/2⌋mod2
据说这个东东可以利用几何来搞。
大致就是在二维平面上,根据r\sqrt{r}r 和 ddd 来弄个直线。
然后确定覆盖的值即可。
然而局限性很大,不好用。
我们考虑一般形式(也就是类欧的基本形式)
∑x=0n⌊(x∗a+b)/c⌋\sum_{x=0}^{n}\lfloor (x*a+b)/c \rfloor∑x=0n⌊(x∗a+b)/c⌋
于是我们就要将这个式子的计算弄成O(log)O(log)O(log)的时间复杂度。
这就是类欧
求解
我们首先设三个函数:
f(a,b,c,n)=∑x=0n⌊(x∗a+b)/c⌋f(a,b,c,n)=\sum_{x=0}^{n}\lfloor (x*a+b)/c \rfloorf(a,b,c,n)=∑x=0n⌊(x∗a+b)/c⌋
g(a,b,c,n)=∑x=0nx∗⌊(x∗a+b)/c⌋g(a,b,c,n)=\sum_{x=0}^{n} x*\lfloor (x*a+b)/c \rfloorg(a,b,c,n)=∑x=0nx∗⌊(x∗a+b)/c⌋
h(a,b,c,n)=∑x=0n(⌊(x∗a+b)/c⌋)2h(a,b,c,n)=\sum_{x=0}^{n}(\lfloor (x*a+b)/c \rfloor)^2h(a,b,c,n)=∑x=0n(⌊(x∗a+b)/c⌋)2
边界条件:当a=0时返回0.
那么我们就要来化简式子了。
一、看到f
- 当a>=c时
- ∑x=0n⌊(x∗a+b)/c⌋\sum_{x=0}^{n}\lfloor (x*a+b)/c \rfloor∑x=0n⌊(x∗a+b)/c⌋
- =∑x=0n⌊(x∗(a=\sum_{x=0}^{n}\lfloor (x*(a=∑x=0n⌊(x∗(a modmodmod c)+b)/c⌋+x∗⌊a/c⌋c)+b)/c \rfloor+x*\lfloor a/c \rfloorc)+b)/c⌋+x∗⌊a/c⌋
- =(n+1)∗n∗⌊a/c⌋/2+∑x=0n⌊(x∗(a=(n+1)*n*\lfloor a/c \rfloor/2+\sum_{x=0}^{n}\lfloor (x*(a=(n+1)∗n∗⌊a/c⌋/2+∑x=0n⌊(x∗(a modmodmod c)+b)/c⌋c)+b)/c \rfloorc)+b)/c⌋
- =(n+1)∗n∗⌊a/c⌋/2+f(a=(n+1)*n*\lfloor a/c \rfloor/2+f(a=(n+1)∗n∗⌊a/c⌋/2+f(a modmodmod c,b,c,n)c,b,c,n)c,b,c,n)
- 恭喜时间缩短一个log。
- 当b>=c时
- ∑x=0n⌊(x∗a+b)/c⌋\sum_{x=0}^{n}\lfloor (x*a+b)/c \rfloor∑x=0n⌊(x∗a+b)/c⌋
- =∑x=0n⌊(x∗a+(b=\sum_{x=0}^{n}\lfloor (x*a+(b=∑x=0n⌊(x∗a+(b modmodmod c))/c⌋+⌊b/c⌋c))/c \rfloor+\lfloor b/c \rfloorc))/c⌋+⌊b/c⌋
- =n∗⌊b/c⌋+∑x=0n⌊(x∗a+(b=n*\lfloor b/c \rfloor+\sum_{x=0}^{n}\lfloor (x*a+(b=n∗⌊b/c⌋+∑x=0n⌊(x∗a+(b modmodmod c))/c⌋c))/c \rfloorc))/c⌋
- =n∗⌊b/c⌋+f(a,b=n*\lfloor b/c \rfloor+f(a,b=n∗⌊b/c⌋+f(a,b modmodmod c,c,n)c,c,n)c,c,n)
- 恭喜时间再缩短一个log。
- 当 a<c 且 b<c 时
- 首先我们设m=⌊(a∗x+b)/c⌋m=\lfloor (a*x+b)/c\rfloorm=⌊(a∗x+b)/c⌋
- 那么原式就转化为:∑x=0n∑y=1m[y<⌊(a∗x+b)/c⌋]\sum_{x=0}^{n}\sum_{y=1}^{m}[y<\lfloor (a*x+b)/c\rfloor]∑x=0n∑y=1m[y<⌊(a∗x+b)/c⌋]
- 于是我们把y<⌊(a∗x+b)/c⌋y<\lfloor (a*x+b)/c\rfloory<⌊(a∗x+b)/c⌋拆出来看看
- y+1≤⌊(a∗x+b)/c⌋≤(a∗x+b)/cy+1\le \lfloor (a*x+b)/c\rfloor \le (a*x+b)/cy+1≤⌊(a∗x+b)/c⌋≤(a∗x+b)/c
- c∗(y+1)≤a∗x+bc*(y+1) \le a*x+bc∗(y+1)≤a∗x+b
- c∗y+c−b−1<a∗xc*y+c-b-1 <a*xc∗y+c−b−1<a∗x
- ⌊(c∗y+c−b−1)/a⌋<x\lfloor (c*y+c-b-1)/a\rfloor<x⌊(c∗y+c−b−1)/a⌋<x
- 那么带入原式就变成了∑y=0m−1∑x=0n[⌊(c∗y+c−b−1)/a⌋<x]\sum_{y=0}^{m-1}\sum_{x=0}^{n}[\lfloor (c*y+c-b-1)/a\rfloor<x]∑y=0m−1∑x=0n[⌊(c∗y+c−b−1)/a⌋<x]
- ∑y=0m−1n−⌊(c∗y+c−b−1)/a⌋\sum_{y=0}^{m-1} n-\lfloor (c*y+c-b-1)/a\rfloor∑y=0m−1n−⌊(c∗y+c−b−1)/a⌋
- n∗(m+1)−∑y=0m−1⌊(c∗y+c−b−1)/a⌋n*(m+1)-\sum_{y=0}^{m-1} \lfloor (c*y+c-b-1)/a\rfloorn∗(m+1)−∑y=0m−1⌊(c∗y+c−b−1)/a⌋
- n∗(m+1)−f(c,c−b−1,a,m−1)n*(m+1)-f(c,c-b-1,a,m-1)n∗(m+1)−f(c,c−b−1,a,m−1)
那么f就推完了
二、看到g
- 当a>=c时,好推,思路和f相近
- =∑x=0nx∗⌊(x∗(a=\sum_{x=0}^{n}x*\lfloor (x*(a=∑x=0nx∗⌊(x∗(a modmodmod c)+b)/c⌋+x2∗⌊a/c⌋c)+b)/c \rfloor+x^2*\lfloor a/c \rfloorc)+b)/c⌋+x2∗⌊a/c⌋
- =(2∗n+1)(n+1)∗n∗⌊a/c⌋/6+∑x=0nx∗⌊(x∗(a=(2*n+1)(n+1)*n*\lfloor a/c \rfloor/6+\sum_{x=0}^{n}x*\lfloor (x*(a=(2∗n+1)(n+1)∗n∗⌊a/c⌋/6+∑x=0nx∗⌊(x∗(a modmodmod c)+b)/c⌋c)+b)/c \rfloorc)+b)/c⌋
- 注意,那条奇怪的n的式子是用平方和公式计算出来的,不懂的百度一下“平方和公式”
- =(2∗n+1)(n+1)∗n∗⌊a/c⌋/6+g(a=(2*n+1)(n+1)*n*\lfloor a/c \rfloor/6+g(a=(2∗n+1)(n+1)∗n∗⌊a/c⌋/6+g(a modmodmod c,b,c,n)c,b,c,n)c,b,c,n)
- 当b>=c时,也好推,思路也相似,就直接贴答案了吧。
- =(n+1)∗n∗⌊b/c⌋/2+g(a,b=(n+1)*n*\lfloor b/c \rfloor/2+g(a,b=(n+1)∗n∗⌊b/c⌋/2+g(a,b modmodmod c,c,n)c,c,n)c,c,n)
- 当a<c且b<c时,我们就也是类似于f,只不过有点麻烦。
- 我们同样的把原式拆成∑x=0nx∗∑y=1m[⌊(c∗y+c−b−1)/a⌋<x]\sum_{x=0}^{n}x*\sum_{y=1}^{m}[\lfloor (c*y+c-b-1)/a\rfloor<x]∑x=0nx∗∑y=1m[⌊(c∗y+c−b−1)/a⌋<x]
- 设T=⌊(c∗y+c−b−1)/a⌋\lfloor (c*y+c-b-1)/a\rfloor⌊(c∗y+c−b−1)/a⌋
- 那么,我们可以移动一下式子:
- ∑y=0m∑x=0n[T<x]∗x\sum_{y=0}^{m}\sum_{x=0}^{n}[T<x]*x∑y=0m∑x=0n[T<x]∗x
- ∑y=0m∑x=T+1nx\sum_{y=0}^{m}\sum_{x=T+1}^{n}x∑y=0m∑x=T+1nx
- 利用求和公式:∑y=0m−1(n+1+t)∗(n−T)/2\sum_{y=0}^{m-1}(n+1+t)*(n-T)/2∑y=0m−1(n+1+t)∗(n−T)/2
- 化简:∑y=0m−1((n+1)∗n−T−T2)/2\sum_{y=0}^{m-1}((n+1)*n-T-T^2)/2∑y=0m−1((n+1)∗n−T−T2)/2
- 逐个拆开来看,答案就是:
- n∗m∗(n+1)/2−h(c,c−b−1,a,m−1)/2−f(c,c−b−1,a,m−1)/2n*m*(n+1)/2-h(c,c-b-1,a,m-1)/2-f(c,c-b-1,a,m-1)/2n∗m∗(n+1)/2−h(c,c−b−1,a,m−1)/2−f(c,c−b−1,a,m−1)/2
那么g也推完了,但是我们看到有个h在式子中,怎么办?
三、看到h
- 对于a>=c或b>=c我们设H=⌊a/c⌋H=\lfloor a/c \rfloorH=⌊a/c⌋ E=⌊b/c⌋E=\lfloor b/c \rfloorE=⌊b/c⌋
- 那么我们开始拆式子:
- ∑x=0n(⌊(x∗a+b)/c⌋)2\sum_{x=0}^n(\lfloor (x*a+b)/c \rfloor)^2∑x=0n(⌊(x∗a+b)/c⌋)2
- =∑x=0n(⌊(x∗(a=\sum_{x=0}^n(\lfloor (x*(a=∑x=0n(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋+x∗H+E)2c))/c \rfloor+x*H+E)^2c))/c⌋+x∗H+E)2
- =∑x=0n(⌊(x∗(a=\sum_{x=0}^n(\lfloor (x*(a=∑x=0n(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋)2+2∗(x∗H+E)∗(⌊(x∗(ac))/c \rfloor)^2+2*(x*H+E)*(\lfloor (x*(ac))/c⌋)2+2∗(x∗H+E)∗(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋)+(x∗H+E)2c))/c \rfloor)+(x*H+E)^2c))/c⌋)+(x∗H+E)2
- =∑x=0n(⌊(x∗(a=\sum_{x=0}^n(\lfloor (x*(a=∑x=0n(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋)2+2∗x∗H∗(⌊(x∗(ac))/c \rfloor)^2+2*x*H*(\lfloor (x*(ac))/c⌋)2+2∗x∗H∗(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋)+2∗E∗(⌊(x∗(ac))/c \rfloor)+2*E*(\lfloor (x*(ac))/c⌋)+2∗E∗(⌊(x∗(a modmodmod c)+(bc)+(bc)+(b modmodmod c))/c⌋)+(x∗H+E)2c))/c \rfloor)+(x*H+E)^2c))/c⌋)+(x∗H+E)2
- =h(a=h(a=h(a modmodmod c,bc,bc,b modmodmod c,c,n)c,c,n)c,c,n)
- +2∗H∗g(a+2*H*g(a+2∗H∗g(a modmodmod c,bc,bc,b modmodmod c,c,n)c,c,n)c,c,n)
- +2∗E∗f(a+2*E*f(a+2∗E∗f(a modmodmod c,bc,bc,b modmodmod c,c,n)c,c,n)c,c,n)
- +n∗(n+1)∗(2∗n+1)∗H2/6+n∗(n+1)∗H∗E+(n+1)∗E2+n*(n+1)*(2*n+1)*H^2/6+n*(n+1)*H*E+(n+1)*E^2+n∗(n+1)∗(2∗n+1)∗H2/6+n∗(n+1)∗H∗E+(n+1)∗E2
- 我们发现,当a<c或b<c时,H或E会等于0,所以不会影响答案
- 对于a<c且b<c时,我们就另辟西路。
- 我们首先看到这个转化:
- n2=2∗(n+1)∗n/2−n=(2∗∑i=1ni)−nn^2=2*(n+1)*n/2-n=(2*\sum_{i=1}^ni)-nn2=2∗(n+1)∗n/2−n=(2∗∑i=1ni)−n
- 那么我们就可以再来愉快地推式子啦。
- 设T=⌊(a∗x+b)/c⌋M=⌊(a∗n+b)/c⌋T=\lfloor (a*x+b)/c \rfloor M=\lfloor (a*n+b)/c \rfloorT=⌊(a∗x+b)/c⌋M=⌊(a∗n+b)/c⌋
- 原式=∑x=0n((2∗∑y=1Ty)−T)原式=\sum_{x=0}^n((2*\sum_{y=1}^Ty)-T)原式=∑x=0n((2∗∑y=1Ty)−T)
- =∑x=0n((2∗∑z=0M−1(z+1)∗[T>=z+1])−T)=\sum_{x=0}^n((2*\sum_{z=0}^{M-1}(z+1)*[T>=z+1])-T)=∑x=0n((2∗∑z=0M−1(z+1)∗[T>=z+1])−T)
- (这里M-1是因为后面的z+1)
- 我们把那条又臭又熟悉的式子拆出来。
- 设P=⌊(c∗y+c−b−1)/a⌋P=\lfloor (c*y+c-b-1)/a \rfloorP=⌊(c∗y+c−b−1)/a⌋
- =∑x=0n((2∗∑z=0M−1(z+1)∗[x>P])−T)=\sum_{x=0}^n((2*\sum_{z=0}^{M-1}(z+1)*[x>P])-T)=∑x=0n((2∗∑z=0M−1(z+1)∗[x>P])−T)
- =2∗(∑z=0M−1z∗(n−p)+∑z=0M−1(n−p))−f(a,b,c,n)=2*(\sum_{z=0}^{M-1}z*(n-p)+\sum_{z=0}^{M-1}(n-p))-f(a,b,c,n)=2∗(∑z=0M−1z∗(n−p)+∑z=0M−1(n−p))−f(a,b,c,n)
- =n∗M∗(M+1)−2∗g(c,c−b−1,a,M−1)−2∗f(c,c−b−1,a,M−1)−f(a,b,c,n)=n*M*(M+1)-2*g(c,c-b-1,a,M-1)-2*f(c,c-b-1,a,M-1)-f(a,b,c,n)=n∗M∗(M+1)−2∗g(c,c−b−1,a,M−1)−2∗f(c,c−b−1,a,M−1)−f(a,b,c,n)
至此,式子已经推完。
可以看看例题:陶陶的难题。