题意:一个\(n \times n\)的棋盘,共有m个矩形中的格子为白色。两我的须要博弈,每次操做选择一个边长不超过k的正方形并翻转颜色,每次翻转须要正方形的右下角为白色,轮流操做,不能操做者输。函数
题解:
这个题显然是知足翻硬币游戏的定理,只是将一维改为了二维。
\(sg_{i,j}= \min\{ lowbit(i),lowbit(j),maxbit(k) \}\)。
lowbit(x)是把x当作2进制数的最低位,maxbit(x)时最高位。
接下来证实这个结论。spa
接下来给出几个引理。游戏
定义
\(pre_x = \bigoplus_{i=1}^{x} \text{lowbit(i)}\)
\(f(l,r)= \bigoplus_{i=l}^{r} \text{lowbit(i)}\)it
引理1: \(\forall k \geq 1\),\(pre_{2^k} = 2^{k-1}\)class
证实:考虑各位的贡献易证。gc
引理2: \(\forall k \geq 1\),令集合\(S_k=\{ pre_x | x\in [0,2^k-1] \}\) ,能够证实\(S_k=[0,2^k-1]\)im
证实:概括,k=1时显然成立,当k>1时,\[S_k=\{ pre_x | x\in [0,2^{k-1}-1] \} \bigcup \\ \{ (2^{k-1} + 2^{k-2}) pre_x | x\in [0,2^{k-1}-1] \} \\ =[0,2^{k}-1]\]集合
引理3:\(\forall x \neq y,pre_x \neq pre_y\)
证实:由引理2可知。di
先讨论\(k=n\)的状况,即翻转的正方形没有长度限制。display
咱们考虑概括证实。
首先对于\(i \leq 1\)或\(j \leq 1\)的状况,显然\(sg_{i,j}=1\)。
接下来对于\(i \leq x , j \leq y , (i,j) \neq (a,b)\)的状况都知足结论,咱们须要证实\(sg_{a,b}=\min\{lowbit(a),lowbit(b)\}\)
不妨设\(lowbit(a) \leq lowbit(b)\),\(k=lowbit(a)\)
对于小于2^k的数一定都在S中,由于显然对于\(i < 2^k, lowbit(a-i)=lowbit(b-i)=lowbit(i)\),
因而对于\(x < 2^k,pre_x \in S\)。
只需证实\(2^k \notin S\)
咱们要找\(2^k\),不妨放弱一点条件,咱们只要找值在\([2^k,2^{k+1}-1]\)的便可。
令\(t=a-2^k\),\(k'=lowbit(t)\)
若是\(a-2^k\)或\(b-2^k\)为0,那么必定找不到。
\(lowbit(a)<lowbit(b)\)时,在矩阵的\((a-2^k,b)\)这个位置有一个 \(2^{k'}\)
\(lowbit(a)=lowbit(b)\)时,在矩阵的\((a-2^k,b-2^k)\)这个位置有一个 \(2^{k'}\)
而且显然,以\(2^k\)为边长的正方形只有一个值为\(2^{k'}\)
把这个位置记为\((a',b')\),无论在哪,咱们都得把这个\(2^{k'}\)给消掉
那么新的问题是要在(a',b')为右下角,找到一个值为\([2^{k'},2^{k'+1}-1]\)的正方形。
(为何是正方形呢,由于多出来的右边那一部分或者是上面一部分的值域必定在\([0,2^{k'}-1]\)),因此不会影响答案。
不难发现这个问题跟原来是同样的,并且作有限次以后a,b必定有一个会变为0,因此\(2^k \notin S\),\(\text{mex}\{S\}=2^k\)
这样咱们就解决了\(k=n\)的问题,当\(k < n\)时,显然,k只会对\(\min\{lowbit(a),lowbit(b)\} > maxbit(k)\)的\(sg_{a,b}\)形成影响,
设\(t=2^{maxbit(k)}\)
不难发现,在边长k之内,以(a,b)为右下角和以(2t,2t)为右下角的值是同样的。
\(S=\{f(x,2t-1)|x\in[2t-k+1,2t]\}\)
又\(2t>x,lowbit(x)=lowbit(2t-x)\)
因此\(S= \{pre_x | x\in[0,k-1]\}\)
而\(pre_{2^{k+1}-1}=2^{k}\),由引理3可知\(2^k \notin S\)
既然知道了sg函数,咱们直接扫描线+线段树,因为lowbit的种数不多,枚举每一个lowbit进行维护便可。