题目:
http://acm.bnu.edu.cn/v3/problem_show.php?pid=17178
分析单堆石子时的sg函数,可知,当x%3==0时,先手必败。
此题和普通多堆取石子游戏不同的地方在于:
每次双方可以选取任意堆来取石子,所以:
当存在某些堆石子的sg值不是0时,先手可以同时取这些堆的石子,使得每一堆的sg值全变为0,然后无论对方怎样拿,都可以再次把sg值恢复为0;
当所有堆的石子的sg值都为0时,先手必败。
代码:
#include <cstdio>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#define LL long long
#define db double
#define pi acos(-1.0)
#define pr printf
#define sc scanf
#define mod
#define N 10000
using namespace std;
//
//int c[40]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144
// ,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,
// 268435456,536870912,1073741824
// };
//
//int sg[N];
//
//int dfs(int now)
//{
// int i;
// if(sg[now]!=-1)
// return sg[now];
// bool vis[100];
// memset(vis,0,sizeof(vis));
// for(i=0;i<31;++i)
// {
// // puts("11");
// if(c[i]>now)
// break;
// vis[dfs(now-c[i])]=1;
// }
// i=0;
// while(vis[i]) i++;
// sg[now] = i;
// return i;
//
//}
int main()
{
int n,i,x;
while(scanf("%d",&n)+1&&n)
{
// memset(sg,-1,sizeof(sg));
// sg[0]=0;
bool f=0;
for(i=1;i<=n;++i)
{
sc("%d",&x);
if(x%3) f=1;
}
puts(f?"first":"second");
}
return 0;
}