Foreign 石子遊戲 博弈論

2022-05-20 07:28:21 字數 1625 閱讀 8028

輸出t行,表示每組的答案。31

這顯然是一道博弈論的題目。我們發現這是乙個樹結構,仔細看了一下,發現這顯然是乙個階梯nim的模型。

我們將所有和同n奇偶的值xor起來就可以得到sg。我們先判斷一下,若sg=0則顯然必敗,否則必勝。

然後我們開始計算方案,列舉每乙個節點,目標顯然就是要讓sg=0

由於xor的消去率,根據題意,可以分 2 種情況分別討論:(根據sg異或值判斷是加入還是取出。)

1.從父親那加入值,顯然就是需要 ( sg^a[這個點] ) - a[這個點的父親] <= a[這個點],這樣才可以通過加入若干個值使得sg=0;

2.把值給兒子,顯然需要 (sg^a[這個點]) <= a[這個點],這樣才可以通過拿走若干的值使得sg=0。

然後我們討論一下是否為葉子節點

1.非葉節點,若從父親那加入值只有1的貢獻,把值給兒子(由於有兩個兒子)所以貢獻為2;

2.葉子節點,從父親那加入值或者徹底刪去都顯然只有1的貢獻。

這樣就可以求出方案數了。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

const

int one = 10001;10

const

int inf = 214783640;11

const

int mod = 1e9+7;12

13int

t;14

intn;

15int

x,num;

16int a[17][65537

];17

intsg,ans;

1819

intget

()20

2930

void

solve()

3140

if(!sg)

4142

for(int i=1;i<=n;i++)

4352

if(i==n)

5357}58

}5960 printf("%d"

,ans);61}

6263

intmain()

64

view code

石子遊戲 博弈論

有n n 堆石子,兩人輪流取石子,每次可以將一堆全部拿走,也可以選擇其中y y 個拿,但是要求y y 與這堆石子的總個數互質。求誰會勝利。明顯的博弈論之s g sg 函式。我們可以發現,質數的s g sg 值就等於上乙個質數的s g sg 值加一,而合數的s g sg值就是它的最小質因子的s g s...

取石子 博弈論 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題解 從最簡單的情況推導,什麼情況下是...

博弈論 取石子問題

有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個人輪流從堆中取物 體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲,別看這遊戲極其簡單,卻蘊含著深 刻的數學原理。下面我們來分析一下要如何才能夠取勝。一 巴什博弈 bash game,同餘理論 只有一堆n個物品,...