P5675 [GZOI2017]取石子游戏(博弈,没太懂)

https://www.luogu.com.cn/problem/P5675

#include <bits/stdc++.h>

using namespace std;
#define int long long
const int mod = 1e9 + 7;

int n, a[205], dp[205][260], ans;

signed main() {
    //freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    cin >> n;
    dp[0][0] = 1;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            for (int k = 0; k < 256; k++) {
                if (i == j) dp[j][k] = dp[j - 1][k];//这里一定要跳过,去掉我们枚举的“第一堆”
                else dp[j][k] = (dp[j - 1][k] + dp[j - 1][k ^ a[j]]) % mod;
            }
        }
        for (int j = a[i]; j < 256; j++)
            ans = (ans + dp[n][j]) % mod;//统计第i堆作为第1堆的答案
    }
    cout << ans;
    return 0;
}
原文地址:https://www.cnblogs.com/xcfxcf/p/12557708.html