石子遊戲(nim遊戲 按位考慮)

2022-07-25 06:33:10 字數 1191 閱讀 2039

給\(n\)堆石子,每次最多可以從一堆中取\(x\)個,問你\(x = 1 ... n\)時的答案。

經典\(nim\)遊戲,找規律知\(sg[i] = i \ mod \ (x+1)\)。

於是便要快速求\(a[1]\ mod\ (x+1) \bigoplus ... a[n]\ mod\ (x+1)\)。

考慮按位做,設\(y = x+1\),對於\(k \leq \frac\),求出\(x \in [ky,(k+1)y)\),求有多少\(x-ky\)有\(2^j\)這一位。

預處理出\(f_\)表示對於\(x>=i\),有多少\(x-i\)有\(2^j\)這一位,有

\[f_ = f_} \ + \sum^-1}_ c_k

\]其中\(c_i\)表示\(i\)出現的個數。

考慮統計答案,答案一定是幾個\(2^\)長度的整塊加上乙個散塊,對於整塊,差分即可,對於散塊,發現在\([0,2^j-1]\)之間的貢獻是\(0\),在\([2^j,2^-1]\)之間是\(1\),分\((k+1)y\)在左右半邊討論即可。

#include#define ll long long

#define n 500015

#define rep(i,a,n) for (int i=a;i<=n;i++)

#define per(i,a,n) for (int i=n;i>=a;i--)

#define inf 0x3f3f3f3f

#define pb push_back

#define mp make_pair

#define pii pair#define fi first

#define se second

#define lowbit(i) ((i)&(-i))

#define vi vector#define all(x) x.begin(),x.end()

using namespace std;

int c[n],f[21][n];

int n;

int main()

per(i,0,n) c[i] ^= c[i+1];

rep(j,0,18)

if(now)

}if(ff) printf("alice ");

else printf("bob ");

} return 0;

}

取石子 博弈論 Nim遊戲

題目大意 有n堆石子,第i堆有ai個。每次可以選擇乙個x,選擇乙個質數p滿足p x,選擇乙個0 y a x 然後將y個石子從x移動到x p。問先手有多少種第一步移動的測率能夠必勝?答案除以總方案數輸出。n 106,0 ai 109n 10 6,0 ai 10 9題解 從最簡單的情況推導,什麼情況下是...

Applese 的取石子遊戲( nim博弈 )

第一行是乙個正偶數 n,表示石子的堆數。第二行是 n 個正整數 a1,a2,ana1,a2,an,表示每堆石子的個數。示例1複製 4 2 3 3 3複製 2 n 1052 n 105 1 ai 1051 ai 105 ai ai 為奇數博弈論之nim博弈。當 a1 xor a2 xor xor an...

hiho博弈遊戲 Nim遊戲

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述今天我們要認識一對新朋友,alice與bob。alice與bob總是在進行各種各樣的比試,今天他們在玩乙個取石子的遊戲。在這個遊戲中,alice和bob放置了n堆不同的石子,編號1.n,第i堆中有a i 個石子。每一次行動...