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 早就指出

\[\sum_{i=1}^na_i^k=[z^k]\sum_{i=1}^n\dfrac1{1-a_iz} \]

分治 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}}\) 即可 .

posted @ 2023-01-29 09:18  Jijidawang  阅读(70)  评论(2编辑  收藏  举报
😅​