洛谷.2197.nim遊戲(博弈論 Nim)
阿新 • • 發佈:2018-02-24
博弈 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)