H - Happy Matt Friends

链接:https://vjudge.net/contest/407562#problem/H

题意:给出n个数字,我们可以选择其中任意个数字进行异或操作。

   给定一个权值limit,让我们求出有多少个方案最后得出来的值大于等于limit

思路:对于这道题,我们采用DP的方式

   第一维枚举这n个数字,第二维枚举暴力枚举数字即可

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1050000;
 5 ll dp[50][maxn];
 6 int a[50];
 7 int cal(int x)
 8 {
 9     int num=1;
10     while(x){
11         num++;
12         x/=2;
13     }
14     int tmp=pow(2,num);
15     return tmp;
16 }
17 int main()
18 {
19     int T;
20     scanf("%d",&T);
21     int Case=0;
22     while(T--){
23         int n,limit;
24         scanf("%d%d",&n,&limit);
25         int mx=0;
26         for(int i=1;i<=n;i++){
27             scanf("%d",&a[i]);
28             mx=max(mx,a[i]);
29         }
30         int most=cal(mx)-1;
31 
32         dp[0][0]=1;
33         for(int i=1;i<=n;i++){
34             for(int j=0;j<=most;j++){
35                 dp[i][j]+=dp[i-1][j];
36                 int tmp=j^a[i];
37                 dp[i][tmp]+=dp[i-1][j];
38             }
39         }
40         ll res=0;
41         for(int i=limit;i<=most;i++){
42             res+=dp[n][i];
43         }
44         for(int i=0;i<=n;i++){
45             for(int j=0;j<=most;j++)
46                 dp[i][j]=0;
47         }
48         printf("Case #%d: %lld\n",++Case,res);
49     }
50     return 0;
51 }

 

posted @ 2020-11-14 16:49  古比  阅读(95)  评论(0编辑  收藏  举报