hdu 5795

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795

题意:一个n堆的取石子游戏,每次可以取一堆中的任意个,或者将当前堆分为三个非空堆。求先手/后手必胜。

 思路:打表sg函数找规律。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define N 1000100;
#define LL long long
int sg[200],vis[200];
/*void st()
{
     int i,j,k;
     sg[0]=0;
     for(i=1;i<100;i++)
     {
         memset(vis,0,sizeof(vis));
         for(j=0;j<i;j++)
             vis[sg[i-j]]=1;
         if(i>=3)
         {
             for(j=1;j<i-2;j++)
               for(k=1;k<i-2;k++)
                     if(j+k<i)
                        vis[sg[j]^sg[k]^sg[i-k-j]]=1;
         }
         j=0;
         while(vis[j]) j++;
         sg[i]=j;
         printf("%d
",sg[i]);
     }
}*/
int main()
{
     int t,n,a;
     //st();
     cin>>t;
     while(t--)
     {
         int  ans=0;
         scanf("%d",&n);
         for(int i=0;i<n;i++)
         {
             scanf("%d",&a);
             if(a%8==0) a-=1;
             else if (a%8==7) a+=1;
             ans^=a;
         }
         printf("%s
",( ans ? "First player wins." : "Second player wins."));
     }
    return 0;
}
原文地址:https://www.cnblogs.com/yuanbo123/p/5741125.html