解题思路:
题是简单题,但是数据类型坑了我一下。必须得用长整型才能过
由于pre_j^s[i]=now_j 可得 pre_j^s[i]^s[i]=pre_j=now_j^s[i].所以可得动归方程
dp[i+1][now_j]=dp[i][now_j^s[i]]+dp[i][now_j]
#include<cstdio>
#include<cstring>
#include<iostream>
#define M 1048576
using namespace std;
long long s[50],dp[2][M+1],n,m,ca=1;
void solve()
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<M;j++)
{
dp[(i+1)&1][j]=dp[i&1][j^s[i]]+dp[i&1][j];
}
}
long long sum=0;
for(int i=m;i<M;i++)
sum+=dp[n&1][i];
printf("Case #%lld: ",ca++);
printf("%lld\n",sum);
}
int main()
{
freopen("t.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
for(int i=0;i<n;i++)
scanf("%lld",&s[i]);
solve();
}
return 0;
}