其他分享
首页 > 其他分享> > FFT/NTT学习笔记

FFT/NTT学习笔记

作者:互联网

这是很大的东西,这里只是初学的一些简单题罢了......

以下不区分 FFT 与 NTT

分治 FFT

我们知道,常规的卷积是这样:

\[h_{i}=\sum_{j=0}^{i}f_jg_{i-j} \]

然而很多时候,我们的数列是由自身递推而来的,或者说,形如:

\[f_{i}=\sum_{j=0}^{i-1}f_{j}g_{i-j} \]

运用 cdq 分治 + FFT ,我们可以在 \(O(n \log^2 n)\) 的时间内求出 \(f_1\sim f_{n}\)(\(f_0\) 应该作为初始项给出)。

模板:洛谷P4721 分治FFT

1. ABC213H Stroll

其实看上去很像矩乘,但边权太大了...

依旧设 \(f(i,j)\) 是 \(1\rightarrow i\) 的长度为 \(j\) 的路径数,然后我们发现它的转移十分像卷积。但是会用到之前的 \(f\)。所以分治 FFT 一下即可。时间复杂度 \(O(m T\log^2T)\)。

2. LOJ575 不等关系

好题。LOJ的官方题解讲得很好了。

此类问题的一个常见套路是 \(dp\) :我们从小到大地添加元素进去。但是在本题中没有什么前途。所以得寻找新的方法。

排列计数的另一常见套路是容斥,我们考虑如果只指定某些相邻位置是升序怎么做。换言之要求这个排列被划分成了若干升序段。设段长分别为 \(a_1,a_2,...,a_k\) 那么方案数就是 \(\frac{n!}{\prod a_i!}\)。

本题中,设有 \(k\) 个大于号。设条件 \(A_i\) 代表:第 \(i\) 个大于号的左边大于右边。则我们求的是:

\[|A_1\cap A_2 \cap...\cap A_k|=\sum_{j=0}^{k}(-1)^{j}|\overline{A_{i_1}}\cap...\cap\overline{A_{i_j}}| \]

右边的部分,就只是要求部分大于号和所有小于号的两遍都满足左小于右,其余地没有限制。容易发现方案数就是开始提到的 \(\frac{n!}{\prod_{a_i!}}\)。

此时考虑 dp 来算容斥式子。首先 \(n!\) 可以提出来,所以我们只关心 \((-1)^{j}\) 这个容斥系数,以及分母。

设 \(dp(i)\) 是前 \(i\) 个 的答案。\(dp(0)=1\) 显然。然后我们发现,这里我们不是要枚举哪些数在集合里,而是枚举哪些数不在集合里(这些位置把整个排列划分成了若干上升段)。具体地:

\[dp(i)=\sum_{j=0}^{i-1}[j=0 \lor s_{j}=>]\times (-1)^{cnt_{i-1}-cnt_{j}}\times dp(j)\times \frac{1}{(i-j)!} \]

其中 \(cnt_i\) 是前 \(i\) 个 符号 里大于号的个数。

我们发现这还是 \(n^2\) 的。但是明显是分治 FFT 的式子,于是优化到 \(O(n\log^2 n)\)。

标签:...,FFT,大于号,sum,cap,NTT,笔记,dp
来源: https://www.cnblogs.com/Cry-For-theMoon/p/16107831.html