FFT小结

来源:互联网 发布:电子书阅读器知乎 编辑:程序博客网 时间:2024/05/22 17:02

FFT(快速傅里叶变换)小结

(理论写也只能copy,就略过了)

BZOJ 3160 万径人踪灭

略过manacher求连续回文子序列的部分,问题到了求出总的回文子序列个数

fi表示以i为中心对称的字符对个数,容易想到i对答案的贡献为:

fij=1Cjfi=2fi1

问题转化到了求fi,显然我们可以O(n2)求得,但时间复杂度过高。

manacher处理过后的串中,我们发现对于位置pos,如果si=sj(i+j=pos)则对fpos有贡献。

好了,我们发现这就是个卷积:fi=i1j=1(sj==sij)

分别处理字符a,b,即可

HDU 4609 3-idiots

这题某个学校的校赛出过简化版本的大概题意:给 n个数m次询问, 每次询问 一个k 求和小于k的二元组的对数 n<105,m<105,每个数 ai<105k<2×105。由于值域很小,记录下每个数出现的次数,卷积算一下就好。

回到hdu4609,其实相比上面,就是要减去不合法的答案,与卷积无关就不扯了

hihoCoder 1388 Periodic Signal

(当时板刷了,然而都不会)

将式子展开可以得到A2i+B2i2AiBi+k

前面两项的和是固定的,所以问题转化为了求AiBi+K的最小值

我们将B翻转一下就可以卷积了,但注意到是循环的,和其实是Ci+Ci+n

注意到数很大,FFT精度会不够,所以用大数NTT。

HDU 6061 RXD and functions

(敦老师的妙题,多校现场没转成卷积式)

首先考虑函数的平移,我们发现变换m次等效于变换一次a

为了方便我们把s=a取反,所以题意就是求f(x+s)的系数

依旧是将式子展开,由二项式定理:

f(x+s)      =i=0nxij=inCijcjsji=i=0nxij=inj!(ji)!i!cjsjiai=cni(ni)!,bi=sii!=i=0nxii!j=inanjbji=i=0nxii!j=0nianijbjxi=i=0nxi(ni)!j=0iaijbj

然后NTT搞一搞,倒着输出

PKU Campus 2017 Reverse K-th Problem

(比赛的时候推出了式子,最后没时间了)

题目大意就是给出值域为n长度为n的数组,有·q组询问,问有多少个区间满足第k大为x

看上去是个数据结构,但复杂度明显不对,我们需要O(1)处理每个询问。

假设现在计算下标now的数的答案,我们用Li表示now左边比anow第i大的数的位置,用Ri表示now右边比anow第i打的数的位置,那么对询问anow,k答案的贡献是(Li1Li)(Rki+1Rki)

li=LiLi+1,ri=Ri+1Ri

那么ansanow,k=i=0k1li×rk1i

我们发现这是个卷积,那么我们就可以O(nlogn)算出anow的所有答案。

总的时间复杂度为O(n2logn+q)

原创粉丝点击