zoukankan      html  css  js  c++  java
  • CF1103E Radix Sum

    CF1103E Radix Sum

    给定一个多项式 (F(x)=sum_{i=0}^{10^5} cnt_i imes x^i),对其做 (10) 进制 FWT 快速幂,模数为 (2^{58})

    ( m Sol:)

    我们先进行 DWT,然后将点值进行一下快速幂,然后 IDWT 一下就可以得到答案了。

    如果不是这个奇怪的模数,我们直接进行 ( m 10) 进制 FWT 这道题就做完了。

    由于模数的存在,我们需要解决 ( m 10) 进制 FWT 中不可避免的几个步骤。

    先把范围扩大为 ([0,10^5)),接下来我们进行的操作均在这一范围进行讨论。

    • 求解 (frac{1}{n}),此处为 (frac{1}{10})

    (5) 存在逆元,(2) 没有,由于最后计算 IDWT 时会乘以 (frac{1}{10^5}),所以我们需要找到办法计算 (frac{1}{2^5}),将 (2^{58}) 乘以 (2^5) 变成 (2^{63}),计算得到答案后就可以直接除以 (2^5) 了。

    当然直接当作 (2^{64}) 后用 unsigned long long 不香吗。

    • 得到 (omega_{10}^1)

    回顾 (k) 进制 FWT,我们需要得到对应进制的范德蒙德矩阵,其中每个元素为 (omega_{k}^{x}),此处我们需要得到 (omega_{10}^x)

    此处我们可以直接进行大力扩域,得到额外 (0) 个元素分别表示 (omega_{10}^1,omega_{10}^2,...omega_{10}^9),这样进行运算的复杂度为 (10^2),FWT 的复杂度为 (mathcal O(k^{m+2} imes m)),于是得到了一个 (mathcal O(10^2k^{m+2} m)),最终效率大概是 (5 imes 10^9) 的优秀做法。

    虽然本题开了 ( m 4s) 但也不是给这个做法过的啊 /lb

    然而写着写着你会发现每次乘的都是单项式,所以可以减少一个 (10)

    然后写完会发现最后无法得到答案,因为最后得到的是一个 (omega_{10}^x) 构成的元素组,然而实际上在 FFT/NTT 中计算会进行的消去/折半等引理都没有发生,这一部分我们需要自己手动消一下。

    大概是这样的一个式子:(omega^0-omega^5-omega^2+omega^3)

    最后算出来大概是 (5 imes 10^8),开了 ( m 4s),大致有信仰的人们是可以过的。

  • 相关阅读:
    《将才》读后感
    存储过程
    frame间传值
    IBM TSM解决方案的技术优势
    通过ISA发布Sharepoint 2007的两种认证方式
    ISA Server 2006新功能(1)
    MetaWeblogAPI C# Code Sample
    客户域环境维护记录
    春运教训
    1明
  • 原文地址:https://www.cnblogs.com/Soulist/p/13653574.html
Copyright © 2011-2022 走看看