一开始有一个 n × m n \times m n×m的纸,之后随着游戏的进行,会得到多张不同大小的网格纸,这样就可以记一张纸为一个游戏,各个游戏构成一个游戏的和。其中每一个游戏都是一个有向图游戏,不过我们要自己找到不能行动的局面。显然 1 ∗ 2 1*2 1∗2与 1 ∗ 3 1*3 1∗3( 2 ∗ 1 2*1 2∗1和 3 ∗ 1 3*1 3∗1同理)无法再次分割,且其他矩形均可以分割成这两者之一,因此选取这两个局面作为必败局面。
对于一张 N × M N \times M N×M的矩形网格纸,我们可以枚举如何行动,然后得到两个子游戏,对两子游戏 S G SG SG值进行异或运算,就得到了裁剪后局面对应的SG值。对所有裁剪后局面的 S G SG SG值进行 m e x mex mex运算(将所有值记作一个集合,返回集合内不存在的最小的数)即可得到当前这张纸的SG值。
注意要避开 1 × 1 1 \times 1 1×1的局面
#include
#define int long long
using namespace std;
#define win cout
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence