hihocoder博弈游戏·Nim游戏·三

      在这一次游戏中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;
}
View Code
原文地址:https://www.cnblogs.com/Opaser/p/4510747.html