-
H - Split Game
- Gym - 101954H
- 题意:有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; }
H - Split Game Gym - 分堆博弈
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/84133792
今日推荐
周排行