給\(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 個石子。每一次行動...