alice 和 bob 在玩乙個古老的遊戲。現在有若干堆石子,alice 和 bob 輪流取,每次可以選擇其中某一堆的石子中取出任意顆石子,但不能不取,誰先取完使得另乙個人不能取了算贏。
現在場地上有\(n\)堆石子,編號為 \(1\) 至 \(n\)。alice 很快發現了這個遊戲存在一些固定的策略。陰險的 alice 想贏得這場比賽就來找到主辦方你,希望你在這 \(n\) 堆石子中選出若干堆石子作為最後遊戲用的石子堆並使得 alice 能獲得勝利。你自然不想讓 alice 得逞,所以你提出了乙個條件:alice 在這個遊戲中第一次取的那堆石子的編號需要你來指定(僅指定取的石子堆編號,不指定第一次取多少個,這個指定的石子堆必然包含在最後遊戲用的石子堆中)。
現在你很好奇,你想算算有多少種方案讓 alice 不能獲勝。注意,即使選出的石子堆的編號的集合完全相同,指定第一次取的石子堆的編號不同,也認為方案是不同的。
設 \(f[i][j]\) 表示前 \(i\) 個數字取了若干個異或和為 \(j\) 的方案數,\(g[i][j]\) 表示第 \(i\) 個數以後取若干個數異或和為 \(j\) 的方案數。
列舉每乙個位置作為選擇的石子堆,假設其他石子的異或和為 \(k\),那麼我們只需要滿足無論這堆石子取多少,都有 \(k \operatorname\) 取的石子數 \(\neq 0\)。也就是需要滿足 \(k\geq a_i\)。
直接無腦 \(o(na^2)\) 統計答案即可。其中 \(a\) 表示 \(a\) 的上限。
#include using namespace std;
const int n=260,mod=1e9+7;
int n,ans,a[n],f[n][n],g[n][n];
int main()
洛谷P4702 取石子
題目鏈結 題目描述 alice 和 bob 在玩遊戲。他們有 nn 堆石子,第 i 堆石子有 a i個,保證初始時 ai ai 1 1 ii ai 1 a0視為 0 的一堆石子,並從中取走乙個。誰最後不能取了誰輸。alice 先手,他們都使用最優策略,請判斷最後誰會取得勝利。輸入格式 第一行乙個整數...
洛谷 p1123取數遊戲
定義乙個dfs函式,函式有三個變數,分別是i,j,sum。i,j分別代表訪問的這個點的座標,sum表示這條路徑上的數字的和。思路是 從 1,1 這個點進入,依次以先列數增加,然後行數增加在訪問所有的點。如下 include include include using namespace std in...
洛谷 P1123 取數遊戲
洛谷傳送門 乙個n times mn m的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰 若乙個數字在另外乙個數字相鄰88個格仔中的乙個即認為這兩個數字相鄰 求取出數字和最大是多少。第1行有乙個正整數tt,表示了有tt組資料。對於每一組資料,第一行有兩個正整數nn...