zoukankan      html  css  js  c++  java
  • 尼姆堆

    有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);
        }
    }
  • 相关阅读:

    链表
    Codeforces 1290A/1291C
    Codeforces 1291B
    Codeforces 1291A
    Codeforces 1295C
    Codeforces 1295B
    ZJNU 2356
    ZJNU 2354
    ZJNU 2353
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8594536.html
Copyright © 2011-2022 走看看