FFT 的一类妙用——数列取数问题

问题引入

有一个长为 (N) 的数组 (k) 与一个长为 (M) 的数组 (d),求出 (d) 数组中能被 (le 2)(k) 数组中的数相加表示出来的数有多少个。

本题多组数据。

(1le N,M,k_i,d_ile 2 imes 10^5)

原题链接:SWERC 2014 C

Solution

题意即要求出有多少组 (k_i+k_j=d_k),显然可以考虑 Hash 加暴力枚举,然而毒瘤出题人把 (N)(M) 开到了 (2 imes 10^5),所以这样没有前途。

考虑优化,端详 (k_i+k_j) 的形式,然而并没有什么卵用。

于是 hht 就教了我一个 trick,异常精妙。

对于 (k_i+k_j),可改为 (x^{k_i} imes x^{k_j}),那么,我们可以构造一个多项式 (F(x)=1+sum^{N}_{i=1} x^{k_i})

那么 (F(x)^2) 中的每一项就是可以凑出的所有值,可以直接判断。

由此,我们给出了一个 (O(Nlog N)) 的算法。

少说话,多做事。 ——cnyz 留
原文地址:https://www.cnblogs.com/lajiccf/p/14389996.html