1. 程式人生 > >洛谷.2197.nim遊戲(博弈論 Nim)

洛谷.2197.nim遊戲(博弈論 Nim)

博弈 problem main pan fine 不能 cpp tro 博弈論

題目鏈接

後手必勝(先手必敗,P-position)當且僅當n堆石子數異或和為0。
首先0一定是P-position,
假設a1^a2^a3^...^an=K
若K!=0,則一定可以找到一個ai,ai在K的最高位的1上為1,顯然ai > ai^K,那麽可以把ai變成ai^K,局面就成了a1^a2^...^an^ai^K = K^K = 0 (後手就處於P-position)
若K==0,至少取一個顯然不能使K仍為0

#include <cstdio>
#include <cctype>
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int MAXIN=1e6; char IN[MAXIN],*SS=IN,*TT=IN; inline int read() { int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now; } int main() { int t=read(),n,res; while(t--) { n=read(), res=0; while
(n--) res^=read(); puts(res?"Yes":"No"); } return 0; }

洛谷.2197.nim遊戲(博弈論 Nim)