[CF768E] Game of Stones

[CF768E] Game of Stones - 博弈论

Description

有 N 堆石子,每次可以从一堆石子中取出若干个石子,但是不能两次从同一堆石子中取出同样数量的石子。问先手是否有必胜策略。(1≤N≤10^6),每堆石子数量≤60。

Solution

非常巧妙的等效结论:对于有 n 个的一堆,等效于 Nim 游戏中的 m 个一堆,当且仅当 m 是最大的 (1+2+...+m le n)

每种方案都可以找到像和逆,因而是双射关系

于是原问题就转化为了一个 Nim

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

signed main()
{
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    int ans = 0;
    int x;
    while (n--)
    {
        cin >> x;
        int i = 0;
        int sum = 0;
        while (sum + i + 1 <= x)
            sum += ++i;
        ans ^= i;
    }
    cout << (ans ? "NO" : "YES") << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14396677.html