Paint Chain HDU - 3980

题目链接:https://vjudge.net/problem/HDU-3980

题意:由n个石头组成的环,每次只能取连续的M个,最后不能取得人输。

思路:这样就可以先把它变成链,然后在链上枚举取m个连续点,每次都可以将这条链分成两部分,相当于两个子游戏。对于一个链,一共有n-m-i个子游戏对,用vis数组标记好这些子游戏对的异或值,最后就可以找出sg[n]。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int sg[1010],vis[1010];
 5 int n,m;
 6 void getsg(int len)
 7 {
 8   memset(sg,0,sizeof sg);
 9   for(int i=1;i<=len;i++)
10   {
11     memset(vis,0,sizeof vis);
12     for(int j=0;i-j-m>=0;j++)
13     {
14       vis[sg[i-j-m]^sg[j]]=1;
15     }
16     for(int j=0;;j++)
17     {
18       if(!vis[j])
19       {
20         sg[i]=j;
21         break;
22       }
23     }
24   }
25 }
26 int main()
27 {
28   int t,k=0;
29   cin>>t;
30   while(t--)
31   {
32     cin>>n>>m;
33     printf("Case #%d: ",++k);
34     getsg(n-m);
35     if(n<m||sg[n-m]) puts("abcdxyzk");
36     else puts("aekdycoin");
37   }
38   return 0;
39 }

 

 

 

posted @ 2020-08-27 15:14  JamZF  阅读(110)  评论(0编辑  收藏  举报