和你的推式子过一辈子去吧。

问题

给定若干个数 \(a_1 \dots a_n\)\(q\) 次询问,或单点修改,或询问第 \(i\) 个数取 \([0,a_i]\) 中任意数时,\(n\) 个数异或和是 \(z\) 的方案数。

本题的正确做法应该是贪心,但是我的贪心能力为 \(0\),就十分诡异地发现这个东西可以推式子推出来。

一些记号:

  • \(\text{popc}(i)\)\(i\)\(1\) 个数。
  • \(\text{lb}(i)\)\(i\) 的最低二进制位,如 \(\text{lb}(4) = 4,\text{lb}(7) = 1\)
  • \(m\) 是值域二进制位数,这里是 \(60\)

多个数的异或和,其实就是所有 \(\sum\limits_{j=0}^{a_i} x^j\) 做异或卷积。根据传统 FWT 的定义可以直接写出答案的式子就是:

\[\dfrac{1}{2^{m}}\sum\limits_{i=0}^{2^m-1} (-1)^{\text{popc}(z\&i)} \prod\limits_{j=0}^{n}\sum_{k=0}^{a_j}(-1)^{\text{popc}(k\&j)} \]

这个式子看似难以处理,我们先看看后面一部分。

先解决一个特例:

\[\begin{align*} \sum\limits_{i=0}^{2^k} (-1)^{\text{popc}(x\&i)} & = 2^{k-\text{popc}(x)}\sum\limits_{i=0}^{\text{popc}(x)} \dbinom{\text{popc}(x)}{i}(-1)^i \\ & = 2^{k-\text{popc}(x)}[\text{popc(x)} = 0] \\ & = 2^k[x=0] \end{align*} \]

我们又知道如果 \(a\) 可以拆成 \(\sum\limits_{i=1}^{n} 2^{c_i} (c_1 > c_2 > \cdots > c_n)\),那么 \([0,a]\) 就是 \([0,2^{c_1}-1] \cup [2^{c_1},2^{c_1} + 2^{c_2} - 1] \dots\) 这样一些二的次幂构成的区间,其中前面几位是确定的,后几位是自由的。根据上面的推导,只有自由部分和 \(x\) 无交集(自由部分低于 \(\text{lb}(x)\))时,才有贡献且一个数的贡献就是 \(1\)。经过精细推导后有如下式子:

下面记 \(C(n,x) = (n\&(x - 1)- n\&{x} + 1)\)

\[\sum_{i=0}^{n}(-1)^{\text{popc}(x\&i)} = (-1)^{\text{popc}(x\&n)}C(n,\text{lb}(x)) \]

这看起来好多了,因为 \(\text{lb}(x)\) 只有 \(m\) 种。于是我们枚举 \(\text{lb}(x)\)

\[ans = \dfrac{1}{2^{m}}\sum_{i = 0}^{m + 1}(\prod_{j=1}^{n}{C(a_j,i))\sum_{x=0}^{2^m}[\text{lb}(x) = i](-1)^{\text{popc}(x\&z)}\prod_{j=1}^{n}{(-1)^{\text{popc}(x\&{a_j})}}}\\ \]

前面一块乘积只有 \(m\) 种,如果可以求逆元可以 \(O(m^2)\) 轻松单点修改。(\(O(1)\) 求逆元的话, \(O(m)\) 就可以了)。

后面的范围相当于第 \(i\) 位固定,\(i+1\) 位往后随意。形式还是很好的。对于 \(z\) 和所有 \(a_i\),我们对每一位开一个桶表示有几个数这一位是 \(1\)。后面的乘积相当于是问一段后缀奇数大小的集合乘积和减去偶数大小的集合乘积和,可以 \(O(m)\) DP 解决,同样 \(O(m)\) 单点修改。

这样我们就 \(O(nm^2)\) 的解决了这个问题。

posted @ 2025-09-11 18:34  KIreteria  阅读(24)  评论(0)    收藏  举报