真的好菜啊= =这种dp都不会。
因为和只有1e6,所以就枚举所有能得到的和,
dp[i][j]表示前i个数能达到j这个值所有的种类。
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <vector>
#define mod 1000000007
#define INF 0x3f3f3f3f
#define fuck() (cout << "----------------------------------------" << endl)
using namespace std;
const int maxn = 1000000 + 5;
int a[maxn];
int dp[41][maxn];
int main()
{
int T, kases = 1;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
dp[0][0] = 1;
for(int i=1; i<=n; i++)
for(int j=0; j<maxn; j++)
{
dp[i][j] += dp[i-1][j];
dp[i][j^a[i]] += dp[i-1][j];
}
long long ans = 0;
for(int i=m; i<maxn; i++)
ans += dp[n][i];
printf("Case #%d: %lld\n",kases++, ans);
}
}