hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)

提议分析:

  1 <= N <= 4747

很明显应该不会有规律的,打表发现真没有

按题意应该分成两种情况考虑,然后求其异或(SG函数性质)

  (1)找出单独的一个(一列中只有一个)

  (2)找出连续的两个都没有涂色的求SG值(打表)

#include<stdio.h>
#include<string.h>
#define Max 4750
int dp[Max];
int mex[Max];
int flag[Max];
void Gsdp()
{
int i,j;
int l,r;
dp[]=;
dp[]=;
for(i=; i<Max; i++)
{
for(j=; j<=i; j++)
{
l=j-;
r=i-j;//分成左中右
mex[dp[l]^^dp[r]]=i;//涂色1
if(j+<=i)
{
l=j-;
r=i-(j+);
mex[dp[l]^dp[r]]=i;//涂色2*2
}
}
//for(j=0; mex[j]==i; j++)少了分号
j=;
while(mex[j]==i)j++;
dp[i]=j;
}
//printf("#%d\n",dp[13]);
}
int main()
{
int t,n,m,ans;
int x,y;
int i,j,k;
Gsdp();
scanf("%d",&t);
for(i=; i<=t; i++)
{
scanf("%d %d",&n,&m); memset(flag,,sizeof(flag));
for(j=; j<=m; j++)
{
scanf("%d %d",&x,&y);
flag[y]++;
}
int tmp2=,tmp1=;
ans=;
for(j=;j<=n;j++)
{
if(flag[j]==)tmp1++;//单独一个
if(!flag[j])tmp2++;
else
{
ans^=dp[tmp2];
tmp2=;
}
}
ans=ans^(tmp1%)^dp[tmp2];
printf("Case %d: ",i);
if(ans)printf("Alice\n");
else printf("Bob\n");
}
}
上一篇:hdu 4559 涂色游戏(SG)


下一篇:VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建