前 个点直接暴力,前 个点每次修改的时候只需要把影响了的 个点改一下就行, 号点使用 bitset 优化。
首先所有数同余可以两两做一个差分,就可以将问题转化为所有 是否全部为 的倍数。
注意到此时只需要将 差分一下即可。
考虑如何判定是否全部为 的倍数。考虑随机化算法。
随机若干个 ( 的差分)判断是否为 倍数显然没啥道理,我们希望将多个 合并在一起判断。
我们声称,若 不全为 的倍数,随机选择一个子集,则其所有 之和不为 的倍数的概率至少为 。
考虑选出 不为 的倍数的某个 ,假设这个子集在除了 以外的 的和为 ,那么选 和不选 至少有一个会导致最终的和不为 的倍数,因此概率至少为 。
但是每次暴力随机子集只会导致复杂度变高。考虑初始就随 个子集,计算每个 对这个子集 的系数,然后每次修改就可以 计算每个子集的新 了。
预处理 ,单次修改询问 ,单次询问正确率 ,取 即可,总复杂度 。
本题的部分分从直接维护卷积值开始。较小的 允许选手在每次修改后重新计算所有 ,或者维护受影响的一段 。进一步的数据规模要求观察到“所有 相同”等价于相邻差值全部为 ,从而把问题转成维护一组线性条件。特殊性质 A 中 为素数且 非零,更适合使用代数工具分析;特殊性质 B 中 ,可以用异或或二进制线性关系处理。满分数据需要进一步压缩这些线性条件,或使用高强度随机线性校验等动态线性判定技巧,使单次修改复杂度与 脱离。