Ynoi最有趣了个鬼啊!
传送门
题解
首先这是一道Ynoi的题,并且数据范围非常友好,直接上莫队。
但是这题的模数并不固定,考虑如何处理。
首先考虑一个数$x$,如果他在区间$[L,R]$内出现了$k$次,那么就一共有$2^{R-L+1}-2^{R-L+1-K}$个子序列包含$x$。
不难发现,出现次数相同的数可以一起处理。
而且,不同的出现次数是$O(\sqrt{n})$级别的。设出现了$k$次的数的和为$sum$,那么这些出现次数为$k$的数对答案的贡献就是$sum\cdot(2^{R-L+1}-2^{R-L+1-K})$。
所以,我们可以通过莫队来维护每一种出现次数的数的和,并用一个类似链表的东西来维护当前存在的不同的出现次数。
考虑如何在每次的模数变化之后快速计算$2^k \mod p$。
可以用一个类似于BSGS的算法,先在$O(\sqrt n)$的复杂度内预处理出$2^1,2^2,\cdots,2^{\sqrt n} \mod p$以及$2^{\sqrt n},2^{2\sqrt n},\cdots 2^{n} \mod p$的值,然后每次就可以$O(1)$计算$2^k \mod p$了。
所以在莫队的过程中,对于每个询问先预处理$2$的幂,然后更新出现次数的信息,再遍历每种出现次数计算贡献即可。
时间复杂度$O(n\sqrt n)$。
代码
1 |
|