Source
题意:有N个数,从这些数中选一个或多个进行亦或运算,问一共有多少种选法使得最后的亦或结果大于给定的M。
思路:这道题要用dp,应该是比较容易想到的,其实就是一个背包问题
f(i,j) 代表用0号到i号这些数选一些亦或出来结果为j的方案数
状态递推式:
f(i,j)=f(i-1,j)+f(i-1,j^a[i])
其中之所以是j^a[i],是因为如果要选a[i]的话,j^a[i]^a[i]=j
代码如下:
#include<cstdio>
#include<string.h>
int f[45][2000000];
int main()
{
int t,T,n,m,x;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%d%d",&n,&m);
memset(f,0,sizeof(f));
scanf("%d",&x);
f[0][0]=1;
f[0][x]=1;
for(int i=1;i<n;i++)
{
scanf("%d",&x);
f[i][0]=1;
for(int j=0;j<1048576;j++)
f[i][j]=f[i-1][j]+f[i-1][j^x];
}
long long ans=0;
for(int i=m;i<1048576;i++) ans+=f[n-1][i];
printf("Case #%d: %lld\n",t,ans);
}
return 0;
}