原题链接
给一棵 n 个点的有根树,节点 1 是根。节点 i 的初始权值为 wi。 定义一次操作是对于每个 i,将 wi 修改成操作前 i 的子树的所有权值的异或和。 有 q 次独立的询问,每次询问是求 ti 次操作后 w1 的值。
1≤n,q≤2×105,1≤wi,ti≤109。
首先不难发现由于每一次操作相当于做前缀和,所以同一层上的点要么都有贡献,要么都没贡献。那么设 fi,j 表示第 i+1 次操作之后深度为 j 的点是否有贡献,显然 f0,j=1。
稍加思考可以发现递推式 fi,j=fi−1,jxorfi,j−1,因为第 j 层的点对第 j−1 层的点有贡献。
画出转移图:
旋转 45°:
所以说 fi,j≡Ci+jj(mod2)。
或者说其实这个递推式相当于求从左上角只能向下向右走走到 (i,j) 的方案数,一共有 i+j 次操作,其中有 j 次向下。
然后根据 Lucas 定理,Cnm≡Cnmod2mmod2×C⌊2n⌋⌊2m⌋(mod2),那么对于 n,m 二进制第 i 位 x,y,当 x=0,y=1 时这一位就会让乘积变成 0,所以 fi,j=1 当且仅当 i+jandj=j,即 iandj=0。
那么求出 ai 表示所有深度为 i 的点的点权的异或和,sumi=xorjandi=jaj,那么 t 次操作之后的答案就相当于是 sum(t−1)二进制按位取反的结果。
注意 t=0 的情况要特判。