正题
题目链接:https://www.luogu.com.cn/problem/P5675
题目大意
nnn堆石子,第iii堆有aia_iai个。指定一些石子堆使得先手必胜并指定一个先手第一个取的位置使得先手必败,求有多少方案数。
解题思路
根据NIMNIMNIM游戏,只要石子数异或和为000则先手必败。
然后我们考虑枚举指定先手先去哪一堆石头,我们要选择一些石子堆使没有任何一种方法取走一些石头使得先手必败。
我们用fi,jf_{i,j}fi,j表示在不包括枚举的石头堆的情况下,前iii堆石头有多少种选择方案使得其异或和为jjj。然后若强制先手选择第kkk堆石头那么方案数就是∑i=ak∞fn,i\sum_{i=a_k}^\infty f_{n,i}i=ak∑∞fn,i
时间复杂度O(n3)O(n^3)O(n3)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=210,XJQ=1e9+7;
int n,a[N],f[N][256],ans;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int k=1;k<=n;k++){f[0][0]=1;for(int i=1;i<=n;i++){if(i==k){for(int j=0;j<256;j++)f[i][j]=f[i-1][j]; }else{for(int j=0;j<256;j++)f[i][j]=(f[i-1][j]+f[i-1][j^a[i]])%XJQ;}}for(int i=a[k];i<256;i++)ans=(ans+f[n][i])%XJQ;}printf("%d",ans);
}