洛谷 [P4301] 新Nim游戏

线性基 +博弈论

先手必胜当且仅当先手取完之后留下的序列无论如何组合,异或和都不为 0
也就是剩下的整数线性无关,所以我们对所有整数排序,由高往低的贪心的插入线性基,
无法插入的就有先手取出,容易发现,先手必胜

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define ll long long
using namespace std;
ll n, lb[105], a[105], ans;
bool insert(int x) {
    for(int i = 32; i >= 0; i--) {
        if(x >> i & 1ll) {
            if(!lb[i]) {
                lb[i] = x;
                return 1;
            }else x ^= lb[i];
        }
    }
    return 0;
}
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    for(int i = n; i >= 1; i--) {
        if(!insert(a[i])) ans += a[i];
    }
    cout << ans << endl;
    return 0;
}
posted @ 2018-03-30 21:21  Mr_Wolfram  阅读(...)  评论(...编辑  收藏