zoukankan      html  css  js  c++  java
  • 每天一道博弈论之“巴什博弈”

       由于明天开学,不一定有时间写博客,故今天一次写两道题qaq

    q1:

       题意:

       一堆n个石子,可以取1,2,3...m个,双方轮流取,给你n和m,问先手胜还是后手胜

      题解:

       易得当n%(m+1)==0时后手必胜,否则先手胜。假如对方取x个,你就取(m+1-x)个,使得对手面对的数一直是(m+1)的倍数,当最终对手面对m+1时,显然他已经输了。

    q2:

      题意:

       一堆n个石子,可以取1,2,4,8...(2的次幂)个,给你n,问先手胜还是后手胜

      题解:

       首先我们可以考虑根据SG函数,可以在O(nlogn)的复杂度内算出答案。这种做法大概可以解决n<=10^5的数据。那么n很大怎么办呢?有没有O(1)的做法呢?

       当然有啦^_^

       请考虑上面一题中用到的技巧。我们可以发现2的次幂在mod3的意义下只可能是1或者2(没有0),所以我们猜想是不是n为3的倍数时后手必胜呢?

       我们假设对手拿到n为3的倍数,且对手拿完之后剩余大于3(因为剩下1或2你就赢了,而对手不可能拿掉3的倍数),那么你一定可以通过拿掉1或者2使之变为3的倍数。那么对手一定会面临面前数字为3的窘境,这时他已经黔驴技穷了。

       综上,n为3的倍数时后手胜,否则先手胜。

  • 相关阅读:
    双向链表

    一个简单makefile
    内存管理
    队列
    postgresql表结构查询sql
    postgresql 命令
    NSMutableDictionary 中使用setValueForKey 和 setObjectForKey有什么区别?
    ViewController 生命周期
    程序启动过程
  • 原文地址:https://www.cnblogs.com/zub23333/p/8503018.html
Copyright © 2011-2022 走看看