帆软杯武汉大学新生赛 I 犹太棋(博弈,SG函数)
题意
"犹太棋"是一种经典的巴什博弈游戏,本题的游戏由其玩法改编而来。你并不需要了解关于"犹太棋"的知识,只需要仔细阅读以下的规则说明:
有一个长为
每一次,当前行动的人可以选择连续的一段、没有棋子的、长度不大于
现在
如果是,输出
其中,
做法
比较显然是用
根据
·对于每次操作,可以取长度为
分为
根据SG定理,
#include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { int n; string s; cin >> n >> s; vector<int> sg(n + 1, -1); sg[0] = 0; sg[1] = 1; sg[2] = 2; auto get = [&](auto self, auto &sg, auto x) { if (sg[x] != -1) return sg[x]; set<int> s; for (int i = 1;i <= 3;i++) { for (int j = 0;j <= x - i;j++) { if (x - i - j >= 0) s.insert(self(self, sg, j) ^ self(self, sg, x - i - j)); } } for (int i = 0; i < n + 2;i++) { if (s.find(i) == s.end()) { sg[x] = i; break; } } return sg[x]; }; int ans = 0; for (int i = 0;i < n;i++) { if (s[i] == '0') { int j = i; while (j < n - 1 and s[j + 1] == '0') j ++; int len = j - i + 1; ans ^= get(get, sg, len); i = j; } } cout << (ans ? "YES\n" : "NO\n"); } signed main(void) { cin.tie(nullptr), cout.tie(nullptr) -> ios::sync_with_stdio(false); solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!