标签:style blog color for 数据 sp div c on
题意:
n堆石头,每堆石头个数:s[1]...s[n]。
每人每次可以选择在一堆中取若干个(不能不取),或者把一堆石头分成两堆(两堆要都有石头)。
无法操作者负。
数据范围:
(1 ≤ N ≤ 10^6, 1 ≤ S[i] ≤ 2^31 - 1)
思路:
S[i]太大了,直接求SG铁定TLE,所以先把SG打出来看看找一下规律。
分堆也挺好理解,把它抽象成游戏图去想就清晰了。
直接看代码。
代码:
int sg[10005]; int s[10005]; ///打表发现当x=0,4k+1,4k+2时sg[x]=x 当x=4k+3时sg[x]=4k+4; x=4k+4时sg[x]=4k+3 /* int dfs(int x){ if(sg[x]!=-1) return sg[x]; bool vis[10005]={0}; rep(i,0,x-1){ vis[dfs(i)]=1; } rep(i,1,x/2){ int t1=0; t1=t1^dfs(i); t1=t1^dfs(x-i); vis[t1]=1; } for(int i=0;;++i) if(!vis[i]) return sg[x]=i; } */ int T,n; int main(){ cin>>T; while(T--){ scanf("%d",&n); rep(i,0,n-1) scanf("%d",&s[i]); int t=0; rep(i,0,n-1){ if((s[i]-1)%4==0 || (s[i]-2)%4==0) t=t^s[i]; if((s[i]-3)%4==0) t=t^(s[i]+1); if((s[i])%4==0) t=t^(s[i]-1); } if(!t) puts("Bob"); else puts("Alice"); } }
hdu 3032 Nim or not Nim? (SG,然后找规律)
标签:style blog color for 数据 sp div c on
原文地址:http://www.cnblogs.com/fish7/p/4005301.html