闲扯
今天考试有一道能用 $NTT$ 拿到其中一个 $10^5$ 的部分分虽然其他几个大佬都被卡常了,但是我没学过,所以今天赶快补一下 $NTT$ 和 $FFT$ 的写法。
P3338 [ZJOI2014]力
题面
Solution
我们先看要求的式子:
化简一下,可以得到:
其中对于 $\sum_{i<j}\frac{q_i}{(i-j)^2}$ ,我们可以设 $f(x)=q_x,g(x)=\frac{1}{x^2}$ ,那么我们相当于求 $\sum_{i=1}^{j-1}f(i)\cdot g(j-i)$ 。
由于 $f(0)=g(0)=0$ ,所以我们可以将其补全为 $\sum_{i=0}^j f(i)\cdot g(j-i)$ 。
这是一个卷积的形式,可以直接用 $FFT$ 求解。
类似的,我们将后面的 $f(x)$ 翻转一下,同样得到了一个卷积,也可以用 $FFT$ 快速求解。
Code
1 |
|
P3723 [AH2017/HNOI2017]礼物
题面
Solution
假设我们已经旋转完了,在两边都添加自然数 $c$ ,相当于是给其中一个加上一个整数 $x$ 。
因为 $m\leq100$ ,所以 $x\in[-100,100]$ ,我们可以直接枚举。
假定是在第一串上添加 $x$ ,考虑贡献:
$\sum_{i=1}^n(a_i^2+b_i^2)$ 是定值,可以提前计算。
$nx^2-2x\sum_{i=1}^n(a_i-b_i)$ 可以通过枚举 $x$ 计算最小值。(也可以通过二次函数知识计算)。
所以我们只需要最小化 $\sum_{i=1}^na_ib_i$ 即可。
我们将 $b$ 数组倒置,就变成了 $\sum_{i=1}^na_ib_{n-i+1}$ 。
由于是一个环,我们将 $a$ 数组复制一遍,然后找 $\min_{k=1}^n(\sum_{i=1}^{n}a_{i+k-1}b_{n-i+1})$ 。
这个我们只需要在 $FFT$ 之后,取 $\min_{i=n+1}^{2n}h(i)$ 即可。
Code
1 |
|
总结
$FFT$ 相关的题,一般都是推出式子后,使用一些小技巧使其变为卷积的形式,然后上模板。