Happy Matt Friends
Happy Matt Friends
Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0
Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less than M , Matt wins.
Matt wants to know the number of ways to win.
For each test case, the first line contains two integers N, M (1 ≤ N ≤ 40, 0 ≤ M ≤ 106).
In the second line, there are N integers ki (0 ≤ ki ≤ 106), indicating the i-th friend’s magic number.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <map> 13 #include <stack> 14 #define LL long long 15 #define INF 0x3f3f3f3f 16 #define pii pair<int,int> 17 using namespace std; 18 const int maxn = 1<<21; 19 int dp[2][maxn],d[41],n,m; 20 int main() { 21 int T,cs=1; 22 scanf("%d",&T); 23 while(T--) { 24 scanf("%d %d",&n,&m); 25 memset(dp,0,sizeof(dp)); 26 for(int i = 0; i < n; ++i) 27 scanf("%d",d+i); 28 LL ans = 0; 29 dp[0][0] = 1; 30 int cur = 0; 31 for(int i = 0; i < n; ++i) { 32 memset(dp[cur^1],0,sizeof(dp[cur^1])); 33 for(int j = 0; j < maxn; ++j) { 34 int tmp = j^d[i]; 35 dp[cur^1][tmp] += dp[cur][j]; 36 dp[cur^1][j] += dp[cur][j]; 37 } 38 cur ^= 1; 39 } 40 for(int i = m; i < maxn; ++i) 41 if(dp[cur][i]) ans += dp[cur][i]; 42 printf("Case #%d: %I64d\n",cs++,ans); 43 } 44 return 0; 45 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。