跳至主要內容

台阶型Nim游戏博弈论

Algorithm数学知识Algorithm数学知识博弈论大约 1 分钟约 343 字全民制作人ikun

台阶型Nim游戏

题目

https://www.acwing.com/problem/content/894/open in new window

现在,有一个 nn 级台阶的楼梯,每级台阶上都有若干个石子,其中第 ii 级台阶上有 aia_i 个石子(i1i \ge 1)。

两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。

已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 nn

第二行包含 nn 个整数,其中第 ii 个整数表示第 ii 级台阶上的石子数 aia_i

输出格式

如果先手方必胜,则输出 Yes

否则,输出 No

数据范围

1n1051 \le n \le 10^5,
1ai1091 \le a_i \le 10^9

输入样例:

3
2 1 3

输出样例:

Yes

思路

将奇数位置上面的数看成是Nim游戏即可,

必胜状态a1a3...an!=0a_1 \land a_3 ...\land a_n!=0

代码

#include <bits/stdc++.h>

#define int long long
using namespace std;


signed main() {
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    int n, res = 0, x;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> x;
        if (i & 1) res ^= x;
    }
    cout << (res ? "Yes" : "No") << endl;


    return 0;
}
上次编辑于:
贡献者: yunfeidog