[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;
}
标签:Stones,一堆,int,石子,long,Game,CF768E 来源: https://www.cnblogs.com/mollnn/p/14396677.html