您的位置:首页 > 其它

ZOJ3067_Nim

2013-10-17 21:47 99 查看
题目的意思就不说了,典型的取石子的博弈问题。

题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身。

但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法。

首先要想保持必胜,必须要取完以后保证所有的石子数异或值为0.

这样,假设我们来判断某一堆是否可取的时候,我们可以用总的异或值来与当前堆石子数异或一下,就得出当前堆应该剩下多少石子哦(仔细理解这里就好了)

下面可以贴代码了:

#include <iostream>
#include <cstdio>
using namespace std;

int a[1005],n,m,ans;

int main()
{
while (scanf("%d",&n) && n)
{
ans=m=0;
for (int i=1; i<=n; i++) scanf("%d",&a[i]),m^=a[i];
if (m==0)
{
printf("0\n");
continue;
}
for (int i=1; i<=n; i++)
if ((a[i]^m)<a[i]) ans++;//一开始的时候我的判断条件是<=,居然也对了,诶数据略水,这里必须是严格的小于。
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: