CF1103E Radix Sum

CF1103E Radix Sum

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

\(\rm Sol:\)

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

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

由于模数的存在,我们需要解决 \(\rm 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}\times m)\),于是得到了一个 \(\mathcal O(10^2k^{m+2} m)\),最终效率大概是 \(5\times 10^9\) 的优秀做法。

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

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

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

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

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

posted @ 2020-09-11 19:22  Soulist  阅读(150)  评论(0编辑  收藏  举报