Split Game Gym
阿新 • • 發佈:2018-12-21
- 題意:有n堆物品每次每個人可以選擇 一堆總量pi的可以把它分為k堆,k<pi ,當數量為1時便不可分了,次數遊戲結束
- 思路:每一堆都可以看做單獨的不影響的,與NIM類似但是需要求各個堆的sg值,進行^即可。sg打表過程中當前數量列舉一下
- 能分成的每一堆的數量,然後看一下堆數,與餘下的那一堆的數量,這些堆的裡面每一堆的數量就是後繼狀態,
- 然後由於有 i/j堆的數量是相同的 根據異或性質偶數次本身異或為0,奇數次本身異或為其本身,
-
#include<bits/stdc++.h> using namespace std; #define maxn 2020 int sg[maxn],n,x; bool vis[maxn]; void getsg() { sg[0]=0; sg[1]=0; for(int i=2; i<=maxn; i++) { memset(vis,0,sizeof(vis)); for(int j=1; j<i; j++) { int div=i/j; int mod=i%j; if(div%2==0) vis[sg[mod]]=1; else vis[sg[mod]^sg[j]]=1; } for(int k=0; k<3000; k++) { if(vis[k]==0) { sg[i]=k; break; } } } } int main() { getsg(); scanf("%d",&n); int ans=0; while(n--) { scanf("%d",&x); ans^=sg[x]; } if(ans==0)printf("Second\n"); else printf("First\n"); return 0; }