cf1091h-solution

CF1091H Solution

link

左边两个点向右移,可以看成右边一个点向左移,因为是无限长的棋盘。

右边两个点左移同理,那么两个人的操作都变成,可以选左或者右一个点向另一边移动。

这样中间点是不动的。会发现问题变成,每一行变成两堆石子 \(z-y-1\)\(y-x-1\),每次可以选一堆,拿走特殊数目(是质数或两个质数的乘积,且不为 \(f\))的石子。

考虑求 sg。这个讲得好啊,那么就是对于每个 \(i\in[1,2\times10^5]\) 求它能到的每个点的 sg 之 mex。

直接做是 \(n^2\) 的,这里 \(n=2\times10^5\)。打表发现 sg 值 \(\le60\),那么可以直接跳 mex,求一下能到的点是否有一个 sg 等于当前 sg。

仍然是不好做的,考虑 bitset 优化。向后走是难的,但是如果直接维护 \(w_{i,j}\) 表示从 \(j\) 开始走是否能走到 sg 为 \(i\) 的点,这样从 \(0\) 开始推,每次求完当前 sg 向前更新一下 \(w\) 即可,跳的时候也可以 \(\Theta(1)\) 查询是否能跳到某个 sg 值了。

最后异或起来即可。复杂度 \(\Theta(nV+\frac{n^2}w)\),这里 \(n=2\times10^5\)\(V\) 约为 \(60\)\(w=64\)

posted @ 2024-02-27 20:20  iorit  阅读(9)  评论(0)    收藏  举报