2023.1.29 闲话
洛谷的 /discuss/563971 给出了一个比较有意思的题 .
rpoks
以下是我想象力范围内的做法,太难的不会 .
有错重 D 谢谢 .
题面
静态区间等幂和(编码 rpoks)
给一个序列 \(\{a_n\}\),\(q\) 组询问,每次给三个整数 \(l,r,k\),求 \(\displaystyle\sum_{i=l}^ra_i^k\),对 \(998244353\) 取模 .
复杂度不算值域 .
A. 一般情况
Algorithm 1. \(\Theta(nq\log k)\)
暴力快速幂 .
Algorithm 2. \(\Theta(nk)\)
离线下来对于每个 \(k\) 做 .
Algorithm 3. \(\Theta(nq\log^2 n)\)
joke3579 早就指出
分治 NTT 暴力计算即可 .
Algorithm 4. \(\Theta(n\log^2n+\sqrt{nkq}\log n)\)
对于 Algorithm 3 分块,块内用分治 NTT 求出答案的前 \(k\) 项,多点求值求出 \(1\dots k\) 的答案,查询的时候块内暴力,块间查表即可 .
令块长为 \(B\),则时间复杂度 \(\Theta\left(\dfrac nB(B\log^2n+k\log^2n)+qB\right)\),取块长为 \(B=\log n\sqrt{\dfrac{nk}q}\) 即可 .
我还不知道怎么不用多点求值做 .
B. 限制 \(\sum k\)
以下令 \(m=\sum k\) .
Algorithm 1. \(\Theta(n\sqrt{mq})\)
根据 A 情况的 Algorithm 2 的做法,这里本质不同的 \(k\) 最多 \(2\sqrt m\) 个,于是算法的复杂度变成 \(\Theta(n\sqrt{mq})\) .
Algorithm 2. \(\Theta(n\sqrt m+q)\)
根号分治,\(k\le\sqrt m\) 的时候对所有 \(k\) 打前缀和表,询问直接查 .
\(k>\sqrt m\) 只会有不超过 \(\sqrt m\) 组,直接暴力 .
Algorithm 3. \(\Theta(n\log^2n+q\sqrt{nm}/\log^3 n)\)
根据 A 情况的 Algorithm 4,阈值分治,\(k\le C\) 的预处理,\(k>C\) 的询问的时候现算 .
令块长为 \(B\),则时间复杂度 \(\Theta\left(\dfrac nB(B\log^2n+C\log n)+\dfrac nB\cdot \dfrac nC\cdot m\log n+qB\right)\) .
取 \(B=\sqrt{\dfrac{nm}{\log^3 n}}\),\(C=\sqrt{\dfrac{nm}{\log n}}\) 即可 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/17071339.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ