FFT(快速傅里叶变换)小结
(理论写也只能copy,就略过了)
BZOJ 3160 万径人踪灭
略过manacher求连续回文子序列的部分,问题到了求出总的回文子序列个数
令fi表示以i为中心对称的字符对个数,容易想到
∑fij=1Cjfi=2fi−1
问题转化到了求fi,显然我们可以O(n2)求得,但时间复杂度过高。
在manacher处理过后的串中,我们发现对于位置pos,如果si=sj(i+j=pos)则对fpos有贡献。
好了,我们发现这就是个卷积:fi=∑i−1j=1(sj==si−j)
分别处理字符a,b,即可
HDU 4609 3-idiots
这题某个学校的校赛出过简化版本的大概题意:给 n个数
回到hdu4609,其实相比上面,就是要减去不合法的答案,与卷积无关就不扯了
hihoCoder 1388 Periodic Signal
(当时板刷了,然而都不会)
将式子展开可以得到∑A2i+∑B2i−2∑AiBi+k
前面两项的和是固定的,所以问题转化为了求∑AiBi+K的最小值
我们将B翻转一下就可以卷积了,但注意到是循环的,和其实是Ci+Ci+n
注意到数很大,FFT精度会不够,所以用大数NTT。
HDU 6061 RXD and functions
(敦老师的妙题,多校现场没转成卷积式)
首先考虑函数的平移,我们发现变换m次等效于变换一次
为了方便我们把s=∑a取反,所以题意就是求f(x+s)的系数
依旧是将式子展开,由二项式定理:
然后NTT搞一搞,倒着输出
PKU Campus 2017 Reverse K-th Problem
(比赛的时候推出了式子,最后没时间了)
题目大意就是给出值域为n长度为
看上去是个数据结构,但复杂度明显不对,我们需要
假设现在计算下标now的数的答案,我们用Li表示now左边比anow第i大的数的位置,用Ri表示now右边比anow第i打的数的位置,那么对询问anow,k答案的贡献是(Li−1−Li)∗(Rk−i+1−Rk−i)
令li=Li−Li+1,ri=Ri+1−Ri
那么ansanow,k=∑i=0k−1li×rk−1−i
我们发现这是个卷积,那么我们就可以O(nlogn)算出anow的所有答案。
总的时间复杂度为O(n2logn+q)。
本文总结了快速傅里叶变换(FFT)在算法竞赛中的应用,包括在BZOJ 3160、HDU 4609、hihoCoder 1388、HDU 6061和PKU Campus 2017 Reverse K-th Problem等题目中的使用。通过FFT解决求回文子序列、二元组对数、最小和、函数变换和区间第k大数的问题,展示了FFT在处理卷积和多项式运算上的效率。
1876

被折叠的 条评论
为什么被折叠?



