题目链接:Paint Chain
写一个SG函数就OK了。
题目大意:给你一串玻璃珠(注意珠子初始化时是一个环)然后两个人轮流去连续的m个珠子,哪个人不能再取,哪个人就算输。值得注意的是,如果给出的m大于n 则先手必败,要特殊考虑。当第一个取完后,那么这串珠就不能形成环了 。
AC代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int g[1002];
int b[1002];
int n,m;
void love_zy()
{
g[0]=0;
int i,j;
for(i=1;i<=1001;i++)
{
memset(b,0,sizeof(b));
for(j=0;j+m<=i;j++ )
b[g[j]^g[i-j-m]]=true;
j=0;
while(b[j])j++;
g[i]=j;
}
}
int main()
{
int T;
int ncase=0;
scanf("%d",&T);
while(T--)
{
ncase++;
scanf("%d%d",&n,&m);
memset(g,-1,sizeof(g));
love_zy();
n=n-m;
/*n<m先手必败*/
if(n<0)
{
printf("Case #%d: abcdxyzk\n",ncase);
continue;
}
if(g[n]!=0)
printf("Case #%d: abcdxyzk\n",ncase);
else
printf("Case #%d: aekdycoin\n",ncase);
}
return 0;
}