您的位置:首页 > 其它

uvalive(NIM博弈)

2015-07-26 11:11 351 查看
题意:

给出有n堆石子;然后每次选一堆,取不能超过一半;谁不能取了,谁就输了;

思路:

标准NIM博弈题;不过还是ai 太大,我们不能求出所有sg值;

所以先求小部分sg值;然后找规律;

观察得出;sg(n) = n % 2 == 0 ? n/2 : sg(n/2);

#include<cstdio>
#include<cstring>
#define ll long long
ll SG(ll x){
return x % 2 == 0 ? x / 2 : SG(x / 2);
}

int main() {
int t;
scanf("%d", &t);
while(t--) {
ll sum = 0;
ll tmp;
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%lld", &tmp);
sum ^= SG(tmp);
}
if(sum)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: