洛谷P1247 取火柴遊戲 數學題 博弈論

2022-08-05 04:27:11 字數 970 閱讀 8519

這題就是nim取石子遊戲,但是nim取石子方案並不是單一的,而是有多種方案的,

現在讓我們求字典序最小的方案,其實還是簡單的,

作為先手,如果是必勝局面,那我們肯定第一步把所有子異或和變為零 ,這樣對於對方,

這就是乙個必敗局面了

2、那我們來考慮怎麼把局面變成必敗局面呢,換句話說,怎麼判斷這一堆取不取呢,

假設a[ i ]不取他們的異或值為 y ,那麼如果我們把a[ i ]變成 y 那麼 y^y=0 就必勝了

那就只要判斷 if a[ i ]>=y 就可知在這一位上改變可不可行了,要字典序最小那就

i從小到大列舉過去就行了,逐位判斷下去當前位是否可行

3、然後我來證明一下為什麼若當前異或值為零為必敗局面(蒟蒻的證明大神請無視qwq)

當前異或值為零,那我們改變一步肯定破壞了這個平衡,然後異或值就不為 0 了,

那麼對方就可以把異或值變為 0 然後一直這麼下去,直到變為0(0的異或值也為 0)

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7 #include 8 #include 9

using

namespace

std ;

1011

intn,sum,pos,val,y ;

12int a[500011

] ;13

14int

main()

1524

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

2533 printf("

%d %d\n

",val,pos) ;

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

35 printf("

%d "

,a[ i ]) ;

36return0;

37 }

洛谷 P1247 取火柴遊戲(nim 遊戲)

簡單說一下 nim遊戲 的博弈原理,先將 a i 轉化成二進位制數,那麼題目變成了每一次可以取走任意 a i 的 任意個 1sum 是所有 a i 的異或值如果 sum 0,說明有偶數個 1,先手拿 x,後手也拿 x,先手必敗如果 sum 0,我們考慮去掉一堆,這 n 1 堆相互異或得到的結果 re...

P1247 取火柴遊戲

輸入k及k個整數n1,n2,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni 接著便是你和計算機取火柴棒的對弈遊戲。取的規則如下 每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。誰取走最後一根火柴為勝利者。例如 k 2,n1 n2 2,a代表你,p代表計算機,若決定...

題解 P1247 取火柴遊戲

題目鏈結 題目大意 nim 遊戲輸方案 博弈論,nim 遊戲 分析 首先 nim 和定理,nim 遊戲存在先手必勝狀態,當且僅當 a 1 bigoplus a 2 bigoplus a 3 dots bigoplus a n neq 0 分析,首先最終狀態所有物品取完 nim 和顯然為 0 為必敗狀...