题意:n 个数分别代表每堆的石子数,问获胜的取法有多少种。
和HDU1850一样的代码。。
简单的再总结下,就是用异或的和 sum 先异或 ai 这堆,由于 a^b^b=a,那么就相当于没考虑这一堆,所以只要把 ai 这堆剩下 sum^ai 个石子,那么所有堆就变成了(sum^ai)^(sum^ai)=0,对手就面临着必败态。所以让 sum^ai 小于 ai,ans++就可以。也就是说每堆最多只有一种取法。
#include<cstring> #include<cstdio> #include<cstring> #include<cmath> #include <vector> #include<string> #include<iostream> #include<algorithm> using namespace std; int a[1005]; int main(){ //freopen("a.txt", "r", stdin); int n; while(cin >> n && n){ int sum = 0; for(int i = 0; i < n; i++){ scanf("%d", &a[i]); sum ^= a[i]; } int ans = 0; for(int i = 0; i < n; i++){ if((sum^a[i]) < a[i]) ans++; } cout << ans << endl; } return 0; }