很不错的算法呢,就是式子有点长,但还是不难推的( ´・・)ノ(._.`)
类欧几里得算法
前置知识
数学技巧
顶底函数
前言
类欧几里德算法是由洪华敦在 2016 年冬令营营员交流中提出的内容,其本质可以理解为,使用一个类似辗转相除法来做函数求和的过程。
主要还是推式子🤔
正文
问题1
设
f(a,b,c,n)=i=0∑n⌊cai+b⌋(1,1)
其中a,b,c,n∈Z。
一眼不可做,似乎像数论分块,但又好像不太行的样子。
a,b,c,n之间的关系也没给,那就分情况吧
首先考虑第一种情况a≥c,b≥c,(也是最简单的一种情况)
此时式子可以进一步化简为 :
f(a,b,c,n)=i=0∑n⌊cai+b⌋=i=0∑n⌊c(⌊ca⌋×c+amodc)i+⌊cb⌋×c+bmodc⌋=i=0∑n(⌊ca⌋i+⌊cb⌋+⌊c(amodc)i+bmodc⌋)=i=0∑n⌊ca⌋i+i=0∑n⌊cb⌋+i=0∑n⌊c(amodc)i+bmodc⌋=2n(n+1)⌊ca⌋+(n+1)⌊cb⌋+f(amodc,bmodc,c,n)(1,2)
此时我们把式子化为了一个含有f的递归式,接下来a,b必定会变得小于c,还需讨论另一种情况
a<c,b<c时,这时候也不能用上面的方法,🤔
利用枚举贡献的方法,将式子化为 :
f(a,b,c,n)=i=0∑nj=0∑⌊cai+b⌋−11(1,3)
似乎什么都没有做的样子。。
需要进一步化简:
i=0∑nj=0∑⌊cai+b⌋−11=i=0∑nj=0∑⌊can+b⌋−1[j<⌊cai+b⌋](1,4)
改了第二层求和的上界,好像有点头绪了
现在限制我们的就是后面的条件表达式了,也许可以将转化为某种方便计算的形式:
∵j<⌊cai+b⌋∴j≤cai+b−1∴jc≤ai+b−c∴jc<ai+b−c+1∴i>ajc+c−b−1∴i>⌊ajc+c−b−1⌋(1,5)
这样的话原来的式子就变为了:
f(a,b,c,n)=i=0∑nj=0∑⌊can+b⌋−1[i>⌊ajc+c−b−1⌋]=j=0∑⌊can+b⌋−1i=0∑n[i>⌊ajc+c−b−1⌋]=j=0∑⌊can+b⌋−1i=⌊ajc+c−b−1⌋+1∑n1=j=0∑⌊can+b⌋−1(n−⌊ajc+c−b−1⌋)=j=0∑⌊can+b⌋−1n−j=0∑⌊can+b⌋−1⌊ajc+c−b−1⌋=⌊can+b⌋n−f(c,c−b−1,a,⌊can+b⌋−1)(1,6)
将⌊can+b⌋设为m再整理一下,又得到一个递归式:
f(a,b,c,n)=mn−f(c,c−b−1,a,m−1)(1,7)
综上(1,2)(1,6):
f(a,b,c,n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧2n(n+1)⌊ca⌋+(n+1)⌊cb⌋+f(amodc,bmodc,c,n)⌊can+b⌋n−f(c,c−b−1,a,⌊can+b⌋−1)a≥c∨b≥ca<c∧b<c(1,8)
可以在O(logn)时间内求出。
问题2
设
g(a,b,c,n)=i=0∑ni⌊cai+b⌋(2,1)
其中a,b,c,n∈Z。
上个问题的升级版,(不就是多了个i嘛,别骂了别骂了)
接着分情况,a≥c,b≥c时:
g(a,b,c,n)=i=0∑ni⌊cai+b⌋=i=0∑ni⌊c(⌊ca⌋×c+amodc)i+⌊cb⌋×c+bmodc⌋=i=0∑ni(⌊ca⌋i+⌊cb⌋+⌊c(amodc)i+bmodc⌋)=i=0∑n⌊ca⌋i2+i=0∑n⌊cb⌋i+i=0∑n⌊c(amodc)i+bmodc⌋i=6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋+g(amodc,bmodc,c,n)(2,2)
看来我们完成了一半了(似乎不是)
a<c,b<c 时,枚举贡献将式子化为:
g(a,b,c,n)=i=0∑nj=0∑⌊cai+b⌋−1i(2,3)
改变上界:
i=0∑nj=0∑⌊cai+b⌋−1i=i=0∑nj=0∑⌊can+b⌋−1i[j<⌊cai+b⌋](2,4)
转化条件表达式:
g(a,b,c,n)=i=0∑nj=0∑⌊can+b⌋−1i[i>⌊ajc+c−b−1⌋]=j=0∑⌊can+b⌋−1i=0∑ni[i>⌊ajc+c−b−1⌋]=j=0∑⌊can+b⌋−1i=⌊ajc+c−b−1⌋+1∑ni(2,5)
设k=⌊ajc+c−b−1⌋,m=⌊can+b⌋,接着化简:
g(a,b,c,n)=i=0∑m−1k+1∑ni=i=0∑m−12(n−k)(n+k+1)=i=0∑m−12n2+n−k2−k=21(mn2+mn−j=0∑m−1(⌊ajc+c−b−1⌋)2−i=0∑m−1⌊ajc+c−b−1⌋)(2,6)
。。。好像化的没问题啊,出现了一个没见过的平方,👀,先定义为h(a,b,c,n)吧,整理一下得:
g(a,b,c,n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧6n(n+1)(2n+1)⌊ca⌋+2n(n+1)⌊cb⌋+g(amodc,bmodc,c,n)21(⌊can+b⌋n(n+1)−h(c,c−b−1,a,⌊can+b⌋−1)−f(c,c−b−1,a,⌊can+b⌋−1))a≥c∨b≥ca<c∧b<c(2,7)
接下来解决带平方的问题。
问题3
设
h(a,b,c,n)=i=0∑n(⌊cai+b⌋)2(3,1)
其中a,b,c,n∈Z。
上个问题还没有完全解决,需要解出h(a,b,c,n),(不就多了个平方嘛,轻车熟路了,别打了别打了)
h(a,b,c,n)=i=0∑n(⌊cai+b⌋)2=i=0∑n(⌊c(⌊ca⌋×c+amodc)i+⌊cb⌋×c+bmodc⌋)2=i=0∑n(⌊ca⌋i+⌊cb⌋+⌊c(amodc)i+bmodc⌋)2(3,2)
手动多项式乘法!
原式变为:
h(a,b,c,n)=h(amodc,bmodc,c,n)+2⌊cb⌋f(amodc,bmodc,c,n)+2⌊ca⌋g(amodc,bmodc,c,n)+⌊ca⌋26n(n+1)(2n+1)+⌊cb⌋2(n+1)+⌊ca⌋⌊cb⌋n(n+1)(3,3)
接着考虑a<c,b<c的情况,设k=⌊ajc+c−b−1⌋,m=⌊can+b⌋,
平方可以拆成:
n2=22n(n+1)−n=(2i=0∑ni)−n(3,3)
避免了出现∑×∑,神一样的数学技巧
h(a,b,c,n)=i=0∑n⌊cai+b⌋2=i=0∑n⎣⎢⎢⎡⎝⎜⎜⎛2j=1∑⌊cai+b⌋j⎠⎟⎟⎞−⌊cai+b⌋⎦⎥⎥⎤=⎝⎜⎜⎛2i=0∑nj=1∑⌊cai+b⌋j⎠⎟⎟⎞−f(a,b,c,n)(3,4)
接着化简前面的部分:
i=0∑nj=1∑⌊cai+b⌋j=i=0∑nj=0∑⌊cai+b⌋−1(j+1)=j=0∑m−1(j+1)i=0∑n[j<⌊cai+b⌋]=j=0∑m−1(j+1)i=0∑n[i>k]=j=0∑m−1(j+1)(n−k)=21nm(m+1)−j=0∑m−1(j+1)⌊ajc+c−b−1⌋=21nm(m+1)−g(c,c−b−1,a,m−1)−f(c,c−b−1,a,m−1)(3,5)
整理一下:
h(a,b,c,n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧h(amodc,bmodc,c,n)+2⌊cb⌋f(amodc,bmodc,c,n)+2⌊ca⌋g(amodc,bmodc,c,n)+⌊ca⌋26n(n+1)(2n+1)+⌊cb⌋2(n+1)+⌊ca⌋⌊cb⌋n(n+1)n⌊can+b⌋(⌊can+b⌋+1)−2g(c,c−b−1,a,⌊can+b⌋−1)−2f(c,c−b−1,a,⌊can+b⌋−1)−f(a,b,c,n)a≥c∨b≥ca<c∧b<c(3,6)
时间复杂度均为O(logn)!
后寄
推完后人傻了😱😱😱,推h后半部分的时候照着OIWiki打的,我太菜了,呜呜呜~。