有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); } }