在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但并不取走石子。比如说有一堆石子为k个,当Alice或者Bob行动时,可以将这一堆石子分成两堆,分别为x,y。满足x+y=k,x,y>0。那么增加了这一条规则后,在Alice总先手的情况下,请你根据石子堆的情况判断是Alice会获胜还是Bob会获胜?
对 于 每 个 堆 可以变成 0-(k-1) 或者 1(k-1)。。。(k-1) 1 SG(K)=mex{ SG( 0 ) , SG(i) ,SG(i)^SG(k-i)... };
#include <iostream> #include <algorithm> #include <cstdio> #include <string.h> using namespace std; const int maxn = 20005; int SG[maxn]; int use[maxn]; int main() { int N; SG[0]=0;SG[1]=1; for(int i=2; i<=20000; i++) { use[0]=i; for(int k=1; k<=i-1; k++) { use[ SG[ k ] ] = i; use[ SG[ k ] ^ SG[ i - k ] ]=i; } for(int k=1; ; k++) { if(use[k]!=i){ SG[i]=k; break; } } } while(scanf("%d",&N)==1) { int ans=0; for(int i=0; i<N; i++) { int a; scanf("%d",&a); ans^=SG[a]; } if(ans)puts("Alice"); else puts("Bob"); } return 0; }