题目链接:https://vjudge.net/contest/152381#problem/B
题意:求解NIM博弈先手必胜的方法数。
解题思路:在必胜态时,先手要做的就是拿走某堆石头中的m个,使得XOR变成0。将必败态转移给后手,题目就是就是问有多种使得XOR变成0的方法数?
=> (ki - m) ^ (XOR ki) 后面的XOR ^ ki代表所有的异或值以后上ki,即等价于除了ki这堆,其他堆的异或和。
=> ki - m = XOR ^ ki
=>m = ki - XOR^ki
要是m > 0即是 ki > XOR^ki,所原来的问题就转换成了求ki > XOR^ki的堆数。

#include <stdio.h>
int a[1010];
int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        if(n == 0) break;
        int SG = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d", &a[i]);
            SG ^= a[i];
        }
        int cnt = 0;
        for(int i = 1; i <= n; i++){
            if(a[i] > (SG^a[i])){
                cnt++;
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}