山东省第九届ACM省赛 Games

版权声明:转载请注明出处 https://blog.csdn.net/TY_GYY/article/details/83031835
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7, maxn=1023+10;
int n, d ,t;
int dp[maxn][15][maxn];//i j k  从前i堆里选j堆除去后 异或值为k的方法数
int a[maxn];

int main() 
{
	scanf("%d", &t);
	while (t--) {
		memset(dp, 0, sizeof(dp));
		scanf("%d %d", &n, &d);
		int temp = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			temp ^= a[i];
		}

		for (int i = 0; i <= n; i++)
			dp[i][0][0] = 1;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= d; j++)
				for (int k = 0; k <= 1023; k++)//最大是1000 转成二进制将0变成1就是1023
					dp[i][j][k] = (dp[i - 1][j][k] + dp[i-1][j-1][k^a[i]]) % MOD;
		int ans = 0;
		for (int j = 1; j <= d; j++)
			ans = (ans + dp[n][j][temp]) % MOD;
		if (!temp)//当temp=0的情况,不删除堆也是一种方案数,ans++
			ans++;
		printf("%d\n", ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/TY_GYY/article/details/83031835