標籤: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,然後找規律)