POJ 2975 Nim題解 簡單的博弈論

2021-08-13 15:50:21 字數 866 閱讀 1934

【題意】:

給定一種nim狀態(相當於含n堆石頭),求能有幾種方法能通過調整某一堆石頭的狀態(只准取出),使新的nim狀態為必敗態。(或者說求出所給的nim遊戲狀態有多少種方法能夠贏)

【分析】:

在證明nim遊戲的sg函式的「根據這個判斷被判為n-position的局面一定可以移動到某個p-position」命題時,有這麼一段證明:對於某個局面(a1,a2,...,an),若a1^a2^...^an不為0,一定存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。不妨設a1^a2^...^an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時ai^k

由此,我們可以知道,對任意的當前狀態s,只需將某堆石頭a[i]變為s^a[i]即可使得整個局面的sg值為0,即變為必敗態。(當然,為了保證操作合法,應當有s^a[i]a[i]時相當於不操作,不合法)

【**】:

[cpp]

view plain

copy

#include

#include

#include

#include

#include

using

namespace

std;  

#define max 1001

intn,a[max],sum,ans;  

intmain()  

for(int

i=1;i<=n;i++)  

if((sum^a[i])

ans++;  

printf("%d\n"

,ans);  

}  return

0;  

}   

POJ 2975 NIM博弈的必勝策略方案數

題意 求解nim博弈先手必勝的方法數。解題思路 在必勝態時,先手要做的就是拿走某堆石頭中的m個,使得xor變成0。將必敗態轉移給後手,題目就是就是問有多種使得xor變成0的方法數?ki m xor ki 後面的xor ki代表所有的異或值以後上ki,即等價於除了ki這堆,其他堆的異或和。ki m x...

題解 poj2054 複雜的貪心

題目鏈結 大佬部落格的講解非常詳細,學習了 詳細思路見上方部落格或者李煜東 演算法競賽高階指南 include include include using namespace std define rep i,a,b for int i a i b i define for i,a,b for in...

題解 POJ1187 隕石的秘密

一開始很愉快地想到了乙個dp,然後發現ab c和a bc這兩種情況會重複計數。但其實在列舉a b型時,可以強制令a一定形如 c 這樣就可以避免重複計數了。include include includeusing namespace std const int mod 11380 int l1,l2,...