zoukankan      html  css  js  c++  java
  • 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 留
  • 相关阅读:
    理解事件驱动select,poll,epoll三种模型
    谈谈对线程与进程的理解
    5-3.首行缩进
    5-2.行高
    5-1.字间距
    4-6.字体样式重置
    4-5.字体风格
    4-4.字体粗细
    4-3.字体颜色设置
    4-2.字体设置
  • 原文地址:https://www.cnblogs.com/lajiccf/p/14389996.html
Copyright © 2011-2022 走看看