Codechef WEASELTX 做题记录

原题链接

给一棵 nn 个点的有根树,节点 11 是根。节点 ii 的初始权值为 wiw_i。 定义一次操作是对于每个 ii,将 wiw_i 修改成操作前 ii 的子树的所有权值的异或和。 有 qq 次独立的询问,每次询问是求 tit_i 次操作后 w1w_1 的值。

1n,q2×1051\le n,q\le 2\times 10^51wi,ti1091\le w_i,t_i\le 10^9

首先不难发现由于每一次操作相当于做前缀和,所以同一层上的点要么都有贡献,要么都没贡献。那么设 fi,jf_{i,j} 表示第 i+1i+1 次操作之后深度为 jj 的点是否有贡献,显然 f0,j=1f_{0,j}=1

稍加思考可以发现递推式 fi,j=fi1,jxorfi,j1f_{i,j}=f_{i-1,j}\operatorname{xor} f_{i,j-1},因为第 jj 层的点对第 j1j-1 层的点有贡献。

画出转移图:

旋转 45°45\degree

所以说 fi,jCi+jj(mod2)f_{i,j}\equiv C_{i+j}^j\pmod 2

或者说其实这个递推式相当于求从左上角只能向下向右走走到 (i,j)(i,j) 的方案数,一共有 i+ji+j 次操作,其中有 jj 次向下。

然后根据 Lucas 定理,CnmCnmod2mmod2×Cn2m2(mod2)C_{n}^m\equiv C_{n\operatorname{mod} 2}^{m\operatorname{mod} 2}\times C_{\lfloor\frac{n}{2}\rfloor}^{\lfloor\frac{m}{2}\rfloor}\pmod 2,那么对于 n,mn,m 二进制第 iix,yx,y,当 x=0,y=1x=0,y=1 时这一位就会让乘积变成 00,所以 fi,j=1f_{i,j}=1 当且仅当 i+jandj=ji+j\operatorname{and}j=j,即 iandj=0i\operatorname{and} j=0

那么求出 aia_i 表示所有深度为 ii 的点的点权的异或和,sumi=xorjandi=jajsum_i=\operatorname{xor}_{j\operatorname{and} i=j} a_j,那么 tt 次操作之后的答案就相当于是 sum(t1)sum_{(t-1)二进制按位取反的结果}

注意 t=0t=0 的情况要特判。