FFT/NTT基础题总结

在学各种数各种反演之前把以前做的$FFT$/$NTT$的题整理一遍

还请数论$dalao$口下留情

T1快速傅立叶之二

题目中要求求出

$c_k=\sum\limits_{i=k}^{n-1}a_i*b_{i-k}$

首先可以把$a$翻转,

$c_k=\sum\limits_{i=k}^{n-1}a_{n-1-i}*b_{i-k}$

$c_k=\sum\limits_{i=0}^{n-k-1}a_{n-k-1-i}*b_{i}$

也就是说对新的$a$,$b$数组做一遍$FFT$得到的便是$c$数组翻转后的数组

T2力

$f[i]=\sum_{j=1}^{i-1}\frac{q[j]}{(i-j)^2}-\sum_{j=i+1}^{n}\frac{q[j]}{(i-j)^2}$

$f[i]=\sum_{k=1}^{min(n-i,i-1)}\frac{q[j-k]-q[j+k]}{k^2}$

构造出一个$g[i]=\frac{1}{i^2}$就是一个裸的卷积了

T3Normal

因为期望的可加性,把每个点的贡献单独处理,即求期望深度

考虑$y$对$x$的贡献:当且仅当$x->y$的路径上第一个点就选$y$,$y$才能成为$x$的祖先

所以$y$对$x$的贡献就是:$P=\frac{1}{dis(x,y)+1}$,$E=1$

所以最终答案就是$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac{1}{dis(i,j)+1}$

用点分治+$FFT$便可以$O(nlog_2^2(n))$解决

 T4Triple

这道题的FFT并不难想,只是容斥比较复杂,在这里不再赘述

T5万径人踪灭

设$c[i]=\sum\limits_{j=1}^{i-1}[s[i]==s[i-j]]$($s$数组从$1$开始编号)

$ans_i=2^c[i]$-不合法的个数,不合法的可以用$hash$二分

求$c[i]$可以分别考虑$a$,$b$的贡献,以a为例:设$b[i]=s[i]=='a'$

那么$c[i]=\sum\limits_{j=1}^{i-1}b[j]*b[i-j]$,便成了卷积的形式,FFT求解即可

T6序列统计

看到乘积果断选择原根化乘法为加法,之后因为N很大,需要用快速幂+NTT

猜你喜欢

转载自www.cnblogs.com/AthosD/p/12019413.html