首先我們要知道 \(sg\) 定理: \(sg_ = sg_1 \ xor \ sg_2\ xor \ sg_3 \ xor \ ... \ xor \ sg_n\) 。
所以我們可以預處理出1到100000中每個數的 \(sg\) 值,對於每乙個詢問,我們只需求一下 \(sg_\) 就好了。
那怎麼預處理出每乙個數的 \(sg\) 值呢?
對於某一堆 \(i\) ,有 \(i\) 個石子,我們可以列舉分成的堆數 \(m (2 \le m \le i)\) 。設分成 \(m\) 堆後, 每堆的石子個數為 $ x_i $ , 我們求出$ sg[x_i] $ 的異或和 $ res $ ,就是分成 \(m\) 堆後的狀態的 \(sg\) 值,然後取 \(mex\) 運算得出當前狀態 \(i\) 的 \(sg\) 值。
可這太暴力了,時間複雜度是 \(o(n^2)\)的,70分,考慮優化。
我們可以發現分成的 \(m\) 堆的石子數最多有兩種取值,分別是: \(i / m, (i / m) + 1\)。這兩種取值的個數分別是: \(i \% m , m - i\%m\)。
再考慮有貢獻的值,因為求的是 $ sg $ 的異或和,所以只有某個取值的個數為奇數個時,才有貢獻。接下來只需判斷兩種取值的個數的奇偶性就好了。
舉個例子:\(i = 9\) 時
m : 2 3 4 5 6 7 8 9
i / m : 4 3 2 1 1 1 1 1
可以發現 \(m\) 從5到9, \(i / m\) 值是相同的,對於某些不同的 $ m$ , $i / m $ 的值相同,就可以用整除分塊做。我們把後面分的石子堆數都列出來:
5 : 2 2 2 2 1
6 : 2 2 2 1 1 1
7 : 2 2 1 1 1 1 1
8 : 2 1 1 1 1 1 1 1
9 : 1 1 1 1 1 1 1 1 1
可以發現某乙個數目的石子堆數的奇偶性是一定的,證明:多舉幾個例子就好了
當 \(\begin\frac \end\)為奇數時,\(\beginm -i\%m = m - (i- m\times\lfloor \frac\rfloor)=m \times (1+\lfloor \frac\rfloor)-i\end\),對於\(\begin1+\lfloor \frac\rfloor\end\)為偶數,\(m + 1\)後,奇偶性不變
當 \(\begin\frac \end\)為偶數時,\(\begini\%m = i- m\times\lfloor \frac\rfloor\end\),\(m + 1\)後,奇偶性不變
所以對於 \(i / m\) 相等的塊內,分出的石子數的兩種取值的奇偶性的組合只有兩種(有點繞,好好想想),所以對於一整塊內只需算出這兩種不同的 $ sg $ 異或和就好了,因為取 \(mex\) 運算不需要判斷重複的值。第一種和第二種一定可以算出所有不同的 $ sg $ 異或和的值,算前兩種就好了。
#include using namespace std;
inline long long read()
const int n = 105, m = 1e5 + 5;
int t, f, n;
int a[n], sg[m], vis[n];
int main()
}for(int j = 0; ; j++)
if(vis[j] != i)
}while(t --> 0)
if(res == 0) printf("0 ");
else printf("1 ");
}return 0;
}
人人盡說江南好 題解 博弈論
傳送門 heoi2014 人人盡說江南好 先放詞 菩薩蠻 韋莊 人人盡說江南好,遊子只合江南老,青水碧於天,畫船聽雨眠。壚邊人似月,皓腕凝霜雪,未老莫還鄉,還鄉須斷腸。題目分析 第一眼看上去,貌似很難 但是如果再仔細看一下,就會發現 還是很難 不過只要你認真思考這個題,你就會發現 已經過去半個小時了...
迷失在江南
張明泉 不只是在夢中 我常常迷失了自己 在江南窄窄的巷陌 我常常忽然間失憶 忘卻自己怎麼會出現在那裡 我曾去過荒無人煙的大漠邊關 也曾騎過駿馬跨過遼闊的草原 也曾蝸居在嶺南乙個不出名的山寨 可是 在江南 我怎麼就走失了自己 走失在江南的日子裡 走失在稠密的雨絲裡 走失在女兒紅的醇香裡 走失在紅玉公尺...
江南style java 練習 矩陣
package kaizi 3.將二維陣列中值最大的元素和左上角元素對調,然後將值最小的元素與右下角元素對調。例如 1 4 5 6 7 2 10 11 9 8 12 3,對調後結果 12 4 5 6 7 2 10 11 9 8 3 1 public class testnewmatrix syste...