尼姆堆

有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。

求先取硬币一方有无必胜的招法。

// 尼姆堆的模2加(异或)解法
/*
    10
   101
  1100
  1110
--------
  0101  
*/
public class Main {
    static void f(int[] a) {
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum ^= a[i];
        }
        if (sum == 0) {
            System.out.println("输了");
            return;
        }

        for (int i = 0; i < a.length; i++) {
            int x = sum ^ a[i];      //x ^ y ^ y得到的还是x, 我们把sum跟某个异或,得到和其他三个异或的情况,然后再和这三个异或就得到sum初值
            if (x < a[i])
                System.out.println(a[i] + " --> " + x);
        }
    }

    public static void main(String[] args) {
        int[] a = { 2, 5, 12, 14 };
        f(a);
    }
}
原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8594536.html