码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-02-09 12:19:29      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:code   trick   ref   构造   force   math   判断   hash   就是   

问题引入

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

本题多组数据。

\(1\le N,M,k_i,d_i\le 2\times 10^5\)

原题链接:SWERC 2014 C

Solution

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

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

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

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

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

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

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

标签:code   trick   ref   构造   force   math   判断   hash   就是   

原文地址:https://www.cnblogs.com/lajiccf/p/14389996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!