博弈论——Paint Chain HDU - 3980
程序员文章站
2022-06-09 19:18:16
...
题解:
关键在于SG打表的方式:
每当拿走一个珠子,相当于圆形的串被分割:串长为从1到n-k;然后循环递归求出SG值
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int T,m,n;
int sg[2006];
int mex(int a)
{
if(sg[a]!=-1) return sg[a];
int vis[2001];
memset(vis,0,sizeof(vis));
for(int i=0;2*i<=a-m;i++)
{
sg[i]=mex(i);
sg[a-m-i]=mex(a-m-i);
vis[sg[i]^sg[a-m-i]]=1;
}
for(int i=0;i<n-m;i++)
{
if(!vis[i]) return i;
}
return -1;
}
int main()
{
cin>>T;
for(int k=1;k<=T;k++)
{
cin>>n>>m;
memset(sg,-1,sizeof(sg));
sg[0]=0;
if(n>m) sg[n-m]=mex(n-m);
printf("Case #%d: ",k);
if(n>=m&&sg[n-m]==0)
printf("aekdycoin\n");
else
printf("abcdxyzk\n");
}
}