题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5119
题目大意:
在N个数里面选取一些数进行异或运算(可以一个都不取),算出异或后的答案大于等于M的方案数。
思路:
dp[i][j]表示前i个异或结果为j的方案数。
于是就是取或者不取的问题。可以用滚动数组进行优化。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll __int64
#define M 1111111
using namespace std;
ll dp[5][2000006];
int main()
{
ll T,n,m,a[100],i,j,icase=0;
scanf("%I64d",&T);
while(T--)
{
icase++;
scanf("%I64d%I64d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=n;i++)
for(j=0;j<=2000005;j++)
{
dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]];
}
ll ans=0;
for(j=m;j<=M;j++)
{
ans+=dp[n%2][j];
}
printf("Case #%I64d: ",icase);
printf("%I64d\n",ans);
}
}