admin官方

前 33 个点直接暴力,前 77 个点每次修改的时候只需要把影响了的 O(m)O(m) 个点改一下就行,12∼1612\sim 16 号点使用 bitset 优化。

首先所有数同余可以两两做一个差分,就可以将问题转化为所有 did_i 是否全部为 modmod 的倍数。

注意到此时只需要将 bib_i 差分一下即可。

考虑如何判定是否全部为 modmod 的倍数。考虑随机化算法。

随机若干个 did_i(cic_i 的差分)判断是否为 modmod 倍数显然没啥道理,我们希望将多个 did_i 合并在一起判断。

我们声称,若 did_i 不全为 modmod 的倍数,随机选择一个子集,则其所有 did_i 之和不为 modmod 的倍数的概率至少为 12\frac12。

考虑选出 did_i 不为 modmod 的倍数的某个 ii,假设这个子集在除了 ii 以外的 di′d_{i'} 的和为 sumsum,那么选 did_i 和不选 did_i 至少有一个会导致最终的和不为 modmod 的倍数,因此概率至少为 12\frac12。

但是每次暴力随机子集只会导致复杂度变高。考虑初始就随 BB 个子集,计算每个 aia_i 对这个子集 sumsum 的系数,然后每次修改就可以 O(B)O(B) 计算每个子集的新 sumsum 了。

预处理 O(nmB)O(nmB),单次修改询问 O(B)O(B),单次询问正确率 O(1−2−B)O(1-2^{-B}),取 B=O(log⁡q)B=O(\log q) 即可,总复杂度 O(nmlog⁡q+qlog⁡q)O(nm\log q+q\log q)。


本题的部分分从直接维护卷积值开始。较小的 n,m,qn,m,q 允许选手在每次修改后重新计算所有 cic_i,或者维护受影响的一段 cic_i。进一步的数据规模要求观察到“所有 ci mod pc_i\bmod p 相同”等价于相邻差值全部为 00,从而把问题转成维护一组线性条件。特殊性质 A 中 pp 为素数且 bib_i 非零,更适合使用代数工具分析;特殊性质 B 中 p=2p=2,可以用异或或二进制线性关系处理。满分数据需要进一步压缩这些线性条件,或使用高强度随机线性校验等动态线性判定技巧,使单次修改复杂度与 n,mn,m 脱离。