题意: 最后取完的选手胜利,与1907刚好相反。并输出若胜利,则第一步有多少种取的方式。
综上所述,若是 S2,S1,T0 。 则先下的人必输。
若是 T2,S0 。则先下的人必胜。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n , a[110] , m;
int sum1 , sum2 , ans;
while(scanf("%d",&n)!=EOF && n)
{
sum1=sum2=ans=m=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=2) sum1++;
else sum2++;
ans^=a[i];
} //cout<<"ans= "<<ans<<" sum1= "<<sum1<<" sum2= "<<sum2<<endl;
int temp ;
if(ans==0 && sum1>=2|| ans!=0&&sum1==0&&sum2%2!=0)//因为是最后取完者胜,所以判断定相反
printf("0\n");
if(ans!=0 && sum1!=0||ans==0 && sum1==0)
{
if(ans==0) { printf("1\n"); continue;}
//cout<<"************"<<endl;
for(int i=0;i<n;i++)
{
temp=ans;
temp^=a[i]; //异或sum=0,且temp<a[i]说明可以通过取第i堆最后可取胜。
if(temp<a[i] && temp>0) m++;
}
printf("%d\n",m);
}
}
return 0;
}