您的位置:首页 > 大数据 > 人工智能

2016 Multi-University Training Contest 6 1003 A Simple Nim (博弈sg函数)

2016-09-08 21:39 447 查看

题意

有几堆糖果,两个人轮流取,可在某一堆中取任意个,或者选择一堆分成三堆,取走最后一个糖果的人输了。

思路

对于某一堆来说所有状况的后继的糖果数量都小于当前的糖果数量(如果分堆则是三个小的SG的异或值),所以可以地推打一个小范围的SG表,发现当i%8 == 7 时sg[i] = i+1,同时,sg[i+1] = i;

直接根据这个结论就可以算出所有糖果数量的SG值,直接异或即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main (){
int T;
scanf("%d", &T);
while(T --){
int n;
scanf("%d",&n);
int ans = 0;
while(n --){
int tmp;
scanf("%d", &tmp);
if(tmp%8 == 7)
tmp ++;
else if(tmp%8 == 0)
tmp --;
ans ^= tmp;
}
if(ans == 0) puts("Second player wins.");
else puts("First player wins.");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐