HDU 5119

被一个学长逼着做的题。。。谢谢他了~  题中dp[i][j] i即为第i个数,j为当前输入的数能xor到的数

同时一个数有两种选择,1.not xor  2.xor

最大的j不会超过11...11b(20个)=1048575   题目中用了1050000

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MM 50
 4 __int64 dp[MM][1050000];
 5 int num[MM];
 6 int main()
 7 {
 8     int n,m,t,j,i;
 9     scanf("%d",&t);
10     for(int cas=1;cas<=t;cas++)
11     {
12         __int64 ans=0;
13         memset(dp,0,sizeof (dp));
14        
15         scanf("%d %d",&n,&m); 
16         dp[0][0]=1;
17         for( i=1;i<=n;i++)
18         {
19             scanf("%d",&num[i]);
20         }
21         for(i=1;i<=n;i++)
22         {
23             for(j=0;j<1050000;j++)
24             {
25                 dp[i][j]+=dp[i-1][j];   //not xor
26                 long long nj=j^num[i];
27                 dp[i][nj]+=dp[i-1][j];  //xor
28             }
29         }
30         for(i=m;i<1050000;i++)
31         {
32             ans+=dp[n][i];
33         }
34 
35         printf("Case #%d: %I64d\n",cas,ans );
36 
37     }
38     return 0;
39 }

 

posted @ 2014-12-01 17:19  Sylvia小伊  阅读(186)  评论(0编辑  收藏  举报