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 }