Nim游戏

思路:

(1)猜想分析n堆石子的异或和的规律。

(2)结论是:若先手异或和为0,则必败,异或和不为0,则必胜。

(3)证明:

  1. 首先0^0^...^0 = 0;为异或和为0的状态;
  2. 对于异或和不为0,即a1^a2^...^an = x;则x必有至少1位为1,取最高位k位的1,则必存在ai第k位为1,对于ai^x > ai,因为xk位之上的位均为0,则异或后与ai相等,x第k位为1,ai也为1,异或后为0,后面即使异或后全为1,也没有第k位为0小于ai影响大,故ai > ai^x;则取ai - ai^x块石头,则该堆剩下ai ^x块,则总体异或和必为x^x = 0;则异或值不为0可以转化为异或值为0;
  3. 对于异或值等于0,假定将任意ai拿任意个,ai->ai';如果a1^a2^...^ ai' ^...^an==0,则将其与a1^a2^..^an == 0左右分别异或,则ai ^ ai' == 0;则ai == ai';而因为拿走了一些,ai > ai';假设 不成立,这意味着,异或值等于0无论怎样操作,下一步异或值均不为0;
  4. 这意味着,若两者足够聪明,若先手异或值为0,则每步异或值均为0,必败;若先手异或值不为0,则每步异或值均不为0,必胜。

代码:

#include

using namespace std;

int main()
{
    int n;
    cin >> n ;
    int res = 0;
    while(n --)
    {
        int x;
        cin >> x;
        res ^= x;
    }
    
    if(res == 0) puts("No");
    else puts("Yes");
    
    return 0;
}

你可能感兴趣的:(游戏)