参考:
http://www.cnblogs.com/ECJTUACM-873284962/p/6398385.html
http://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html
巴什博奕
只有一堆石子,每个人可以从里面取1~m个石子,先取光者胜。
当 n = m + 1 n = m+1 n=m+1先手必败,因为先手无论选什么,都会使其个数小于m。
因此可以推出更一般的情况:
n = k ∗ ( m + 1 ) n = k*(m+1) n=k∗(m+1)先手必败,因为后手总能构造出 n = t ∗ ( m + 1 ) t < k n = t*(m+1) \ t < k n=t∗(m+1) t<k的情况。
总结: 只要能构造出两个可以相互转换的状态便可得出答案。(必胜态,必败态)。
尼姆博弈
有n推石子,每堆有$m_i$个石子,每次可以取在一堆中取任意个石子。
学着巴什博奕做,构造两个可以相互转换的状态。
把每堆石子的总个数用二进制的形式相加。每位都不进位。
例如:
1 2 3
001
010
011
= 022
因为每次都只能在一堆石子上操作,所以对于每一位,每次只能减1或者不变。可以观察出,当所有位都为偶数的时候(偶状态),先手必败,当有一位为奇数(奇状态)的时候先手必胜。
因为总能从一个奇状态转变为一个偶状态。反之,也能从一个偶状态转变为奇状态。 但无法保持当前状态不变。
考虑异或,当一位出现偶数个时,其贡献为0,否则为1。
所以可以将每一堆的个数都异或起来,如果异或和!=0,则先手胜,否则先手败。
有n推石子,每堆石子的个数分别为1,2,3,4,....,n,每次可以取在一堆中取任意个石子。n特别大。
因为n特别的大,所以没法直接对其异或。 但是连续正整数的异或是有规律的。
f[l,r]
: [ l , r ] [l,r] [l,r]的异或和
推论1: f [ 0 , 2 k − 1 ] = 0 , 2 ≤ k f[0,2^k-1]=0, 2 \leq k f[0,2k−1]=0,2≤k
XJB证明: 二进制的每一位上都有 2 k − 1 2^{k-1} 2k−1个1。
求 f [ 0 , n ] f[0,n] f[0,n]。
-
n为奇数
f [ 0 , n ] = f [ 0 , 2 t − 1 ] ⊕ f [ 2 t , n ] = f [ 2 t , n ] f[0,n] = f[0,2^{t}-1] \oplus f[2^t,n] =f[2^t,n] f[0,n]=f[0,2t−1]⊕f[2