#inclue<stdio.h>
int main()
{
int i,n,num[111],sum,ans;
while(scanf("%d",&n)&&n)
{
ans=0;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
sum^=num[i];
}
if(sum)
{
for(i=0;i<n;i++)
{
if((sum^num[i])<num[i]) ans++;
}
printf("%d\n",ans);
}
else puts("0");
}
return 0;
- 2.可选步数为任意步,SG(x) = x;
- 本题中每一堆都可以选任意个,所以每一堆的SG值都是所剩余的个数。
- 最后结果是所有堆的SG值异或的结果。令ans = 所有堆的SG值异或的结果
- 如果ans == 0,则是必败点。
- 如果ans != 0,使取后结果为0的策略是必胜策略
- 具体怎么取呢?
- 每一堆的数值与ans相异或,所得的结果就是这一堆可以取的数量。
- 但是,如要这一堆数量没有这么多,就不可以这么取
- */