题目链接点这儿
题目让求先手如果可以赢的话,第一步的方案数,明显只要保证第一步之后,NIM和为0即可,遍历一遍解决。
代码如下
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <climits>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
#define rep(i,initial_n,end_n) for(int (i)=(initial_n);(i)<(end_n);i++)
#define repp(i,initial_n,end_n) for(int (i)=(initial_n);(i)<=(end_n);(i)++)
#define reep(i,initial_n,end_n) for((i)=(initial_n);(i)<(end_n);i++)
#define reepp(i,initial_n,end_n) for((i)=(initial_n);(i)<=(end_n);(i)++)
#define eps 1.0e-9
#define MAX_N 1010
using namespace std;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef long long ll;
typedef unsigned long long ull;
int main() {
int n, s;
int a[110];
while(scanf("%d", &n) && n) {
s = 0;
rep(i, 0, n) {
scanf("%d", &a[i]);
s^=a[i];
}
if(!s) { puts("0"); continue;}
int cnt = 0;
rep(i, 0, n) {
s^=a[i];
if(a[i] > s) cnt++;
s^=a[i];
}
printf("%d\n", cnt);
}
}