题目链接: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 }