H-Playing games
Nim博弈模型,在所给的n堆中选择使后手必胜的最大堆数
题意
在$n$堆石子中选择最大数量的堆数,使得对于取出的$n$堆石子,在进行Nim游戏时后手必胜。
这样例膜得也太暴力了吧,苟利苟利苟利.jpg
解法
对于Nim游戏的局面,当且仅当$a_1⊕ a_2⊕ a_3…⊕ a_n=0$时,它是P-position(后手必胜),其中⊕ 表示异或(XOR)运算。
此题可以转化为,在$n$个数中寻找最多的数,使SUM_XOR=0.
我们再将题意转化为,在$n$个数中寻找最少的数,使SUM_XOR=C,其中,$C=a_1⊕ a_2⊕ ……⊕ a_n$
此处引入Fast Walsh-Hadamard Transform(FWT,快速沃尔什变换)求解。
Fast Walsh-Hadamard Transform
FWT的详解参考:
FWT是用于解决多项式位运算卷积的一类方法,如下:
$$C_k=\sum_{i⊕j=k}A_i*B_j$$
对于数组A,我们设其在经过快速沃尔什变换后记作$FWT[A]$
我们需要一个新序列C,由序列A和序列B经过某运算规则得到,即$C=A⊕B$
我们先正向得到$FWT[A],FWT[B]$,然后根据$FWT[C]=FWT[A]*FWT[B]$求出$FWT[C]$,然后逆向运算得到原序列C,复杂度为$O(nlog(n))$
对于异或(XOR)卷积有:
$$tf(A)=(tf(A_0)+tf(A_1)),tf(A_0)-tf(A_1)) $$
$$utf(A)=(utf(\frac{A_0+A_1}{2}),utf(\frac{A_0-A_1}{2}))$$
1 | void FWT_xor(int *a,int opt) |
对于本题,我们考虑将$a_i$的每一维拆开,看作一个$d$维向量,由于$a_i<2^{19}$,取$d=19$
二分答案,取其在异或卷积意义下的$k$次幂,判断能否合成C即可。
代码
1 |
|