Martian148

Back

Question#

CF2211D AND-array

对于一个长度为 nn 的序列 aa,我们定义其 AND 数组 f(a)f(a) 如下:

f(a)k=1i1<i2<<iknai1&ai2&&aikf(a)_k = \sum\limits_{1 \le i_1 \lt i_2 \lt \ldots \lt i_k \le n} a_{i_1} \& a_{i_2} \& \ldots \& a_{i_k}

换句话说,f(a)kf(a)_k 是对序列 aa 中所有长度为 kk 的子序列的元素按位与的和。

序列 aa 对你而言是未知的。但你被提供了一个长度为 nn 的序列 bb,满足对所有 1in1 \le i \le n,都有 bif(a)i(mod109+7)b_i \equiv f(a)_i \pmod{10^9 + 7}。你的任务是基于给定的序列 bb 还原序列 aa

1n105,0bi109+7,0ai<2291\le n\le 10^5, 0\le b_i\le 10^9+7,0\le a_i<2^{29}

Solution#

我们设二进制的第 pp 位在数组 aa 中出现了 cpc_p 次,那么对于一个长度为 kk 的子序列,它的 AND 在第 pp 位为 11 的选法有

(cpk)\binom{c_p}{k}

种,所以第 pp 位对 f(a)kf(a)_k 的贡献就是

2p(cpk)2^{p} \cdot\binom{c_{p}}{k}

于是

bkf(a)kp=0282p(cpk)(mod109+7)b_{k} \equiv f(a)_{k} \equiv \sum_{p=0}^{28} 2^{p}\binom{c_{p}}{k} \quad\left(\bmod 10^{9}+7\right)

这就是整题的本质。

现在我们要把每个 cpc_p 求出来

倒着枚举 k=n,n1,,1k = n, n-1, \ldots, 1

因为:

  • 如果 cp<kc_p < k,那么 (cpk)=0\binom{c_p}{k} = 0
  • 如果 cp=kc_p = k,那么 (cpk)=1\binom{c_p}{k} = 1
  • 如果 cp>kc_p > k,那么它的贡献可以用之前已经知道的 cpc_p 算出来

所以对当前 kk,先把所有 cp>kc_p > k 的贡献减掉:

xk=bkcp>k2p(cpk)(mod MOD)x_k = b_k - \sum_{c_p > k} 2^p \binom{c_p}{k} \quad (\bmod\ MOD)

那么剩下的就是:

xk=cp=k2px_k = \sum_{c_p = k} 2^p

于是我们看 xkx_k 的哪一位为 11 就代表这一位对应的 cp=kc_p=k

现在我们得到了 cpc_p 要构造数组,暴力能放就放就好了

Comment seems to stuck. Try to refresh?✨