这三个f,g,h让我的脑子快要爆炸,还是终于推了出来,记录一下。
记得初一的时候就无意间在ZJY的PPT翻到了这个东西,当时和WYT推了一波,到现在连个印象都没有。
据说有几何推法,我这么渣肯定是不会的了。
参考博客:Xdl.
f(a,b,c,n)=∑ni=0⌊ai+bc⌋
g(a,b,c,n)=∑ni=0i⌊ai+bc⌋
h(a,b,c,n)=∑ni=0⌊ai+bc⌋2
设 a′=a mod c,b′=b mod c
f(a,b,c,n)=∑ni=0⌊a′i+b′c⌋+⌊ac⌋∗i+⌊bc⌋
=f(a′,b′,c,n)+n(n+1)/2∗⌊ac⌋+(n+1)∗⌊bc⌋
进过上面这个调整后可以使 a,b<c ,这也是为什么它叫类欧几里得算法的原因,从最终的式子可以看出来这点。
设 m=⌊an+bc⌋ 。
f(a,b,c,n)
=∑ni=0⌊ai+bc⌋
=∑mj=1∑ni=0[⌊ai+bc⌋>=j]
=∑m−1j=0∑ni=0[⌊ai+bc⌋>=j+1]
=∑m−1j=0∑ni=0[ai>=jc+c−b]
=∑m−1j=0∑ni=0[ai>jc+c−b−1]
=∑m−1j=0∑ni=0[i>⌊jc+c−b−1a⌋]
=∑m−1j=0n−⌊jc+c−b−1a⌋
=nm−∑m−1j=0⌊jc+c−b−1a⌋
=nm−f(c,c−b−1,a,m−1)
这个可以直接递归去求。我设的边界是m=0。
发现a,c的位置互换了。因为a是已经mod过c的了,所以这和欧几里得算法的复杂度是一模一样的。
g(a,b,c,n)=∑ni=0∑ni=0i∗⌊a′i+b′c⌋+⌊ac⌋∗i2+⌊bc⌋∗i
=g(a′,b′,c,n)+n(n+1)(2n+1)/6∗⌊ac⌋+n(n+1)/2∗⌊bc⌋
接下来的变换和f类似,跳一下步:
g(a,b,c,n)
=∑m−1j=0∑ni=0i∗[i>⌊jc+c−b−1a⌋]
到这里,实际上可以用个等差数列搞搞。
=∑m−1j=0(n−⌊jc+c−b−1a⌋)(n+⌊jc+c−b−1a⌋+1)/2
=12∑m−1j=0n(n+1)−⌊jc+c−b−1a⌋−⌊jc+c−b−1a⌋2
=12(mn(n+1)−f(c,c−b−1,a,m−1)−h(c,c−b−1,a,m−1))
h(a,b,c,n)=(∑ni=0⌊a′i+b′c⌋+⌊ac⌋∗i+⌊bc⌋)2
=h(a′,b′,c,n)
+n(n+1)(2n+1)/6∗⌊ac⌋+(n+1)∗⌊bc⌋
+2⌊bc⌋∗f(a′,b′,c,n)+2⌊ac⌋∗g(a′,b′,c,n)
+n(n+1)⌊ac⌋⌊bc⌋
一种有用的写法: x2=(2∑xi=0i)−x
h(a,b,c,n)=∑ni=0(2(∑⌊ai+bc⌋j=1j)−⌊ai+bc⌋)
=2(∑m−1j=0(j+1)∑ni=0[⌊ai+bc⌋>=j+1])−f(a,b,c,n)
=2(∑m−1j=0j∑ni=0[⌊ai+bc⌋>=j+1])+2(∑m−1j=0∑ni=0[⌊ai+bc⌋>=j+1])−f(a,b,c,n)
=2(∑m−1j=0j∑ni=0[i>⌊jc−c−b−1a⌋])+2(∑m−1j=0∑ni=0[i>⌊jc−c−b−1a⌋])−f(a,b,c,n)
=2(∑m−1j=0j∗(n−⌊jc−c−b−1a⌋)+2(∑m−1j=0n−⌊jc−c−b−1a⌋)−f(a,b,c,n)
=m(m−1)n−2g(c,c−b−1,a,m−1)+2mn−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
=m(m+1)n−2g(c,c−b−1,a,m−1)−2f(c,c−b−1,a,m−1)−f(a,b,c,n)
至此,三种常见的形式已经弄完。
实现的话只求f还好,由于g和h相互调用,可能要用结构体来存。
代码的话暂时没有。