题目:hdu3980
题意:有一串含有n个珠子的链子。每个人每次只能给相邻的m个珠子涂色。谁先不能涂了谁就输了。
解答:重点:第一个人涂完之后它就变成了一条直线。然后每次在直线中选m个连续的涂完剩下两条抑或一下就行。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 1010;
int sg[MAXN];
int n,m;
int getsg(int a)
{
if(sg[a] != -1)
return sg[a];
if(a < m)
return 0;
int vis[MAXN];
memset(vis,0,sizeof(vis));
for(int i = 0;i <= a-m;i++)
{
vis[getsg(i) ^ getsg(a-m-i)] = 1;
}
for(int i = 0;;i++)
{
if(!vis[i])
{
sg[a] = i;
return i;
}
}
}
int main()
{
int T;
scanf("%d",&T);
for(int i = 1;i <= T;i++)
{
cin >> n >> m;
cout << "Case #" << i << ": ";
memset(sg,-1,sizeof(sg));
if(n < m || getsg(n - m) != 0)
puts("abcdxyzk");
else
puts("aekdycoin");
}
return 0;
}