标签:
题意:给出n个数,求n个数中几个数通过异或运算得到m的个数。
思路:设dp[i][j]为前i个数中异或为j的个数,dp[i][j]=dp[i-1][j]+dp[i-1][j^a[i]];这dp[i-1][j]很容易懂,就不解释了,对于dp[i-1][j^a[i]],因为j^a[i]^a[i]=j;所以j^a[i]就是前i-1个数中异或能的到j的个数。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 long long dp[3][2000006]; 6 int main() 7 { 8 long long t,n,m,i,j,k=1; 9 long long ans; 10 int a[44]; 11 scanf("%I64d",&t); 12 while (t--) 13 { 14 scanf("%I64d%I64d",&n,&m); 15 for (i=1;i<=n;i++) scanf("%I64d",&a[i]); 16 memset(dp,0,sizeof(dp)); 17 dp[0][0]=1; 18 for (i=1;i<=n;i++) 19 { 20 for (j=0;j<=2000004;j++) 21 dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]]; 22 } 23 ans=0; 24 n=n%2; 25 for (i=m;i<=1400000;i++) ans+=dp[n][i]; 26 printf("Case #%I64d: %I64d\n",k,ans); 27 k++; 28 } 29 }
hdu 5119 Happy Matt Friends (dp)
标签:
原文地址:http://www.cnblogs.com/pblr/p/4829034.html