大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述HDU 5119 Happy Matt Friends相关的知识,希望能为你提供帮助。
Happy Matt FriendsTime Limit: 6000/6000 MS (java/Others)
Memory Limit: 510000/510000 K (Java/Others)
Total Submission(s): 5248
Accepted Submission(s): 2014
Problem Description
Matt has N friends. They are playing a game together.
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.
Input
The first line contains only one integer T , which indicates the number of test cases.
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.
Output
For each test case, output a single line “Case #x: y”, where x is the case number (starting from 1) and y indicates the number of ways where Matt can win.
【HDU 5119 Happy Matt Friends】
Sample Input2
3 2
1 2 3
3 3
1 2 3
Sample OutputCase #1: 4
Case #2: 2HintIn the ?rst sample, Matt can win by selecting:
friend with number 1 and friend with number 2. The xor sum is 3.
friend with number 1 and friend with number 3. The xor sum is 2.
friend with number 2. The xor sum is 2.
friend with number 3. The xor sum is 3. Hence, the answer is 4.
Source
2014ACM/ICPC亚洲区北京站-重现赛(感谢北师和上交)
Recommend
liuyiding
题意:有N个人,每个人有一个权值,挑选一些人并将他们的权值异或,求最后得到的值大于M的取法有多少种;
题解:对于每个值都有取和不取两种状态,用dp[i]表示亦或结果为i的方案数;int x = a[i] ^ j;
dp[now][x] = dp[pre][x] + dp[pre][j];
参考代码为:
#include < bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 45; const int maxm = (1< < 20); int a[maxn]; LL dp[2][maxm]; int main() { int t; scanf("%d", & t); for(int k = 1; k < = t; k++) { int n, m; scanf("%d%d", & n, & m); for(int i = 1; i < = n; i++) { scanf("%d", & a[i]); } memset(dp, 0, sizeof(dp)); dp[0][0] = 1; int pre = 0, now = 1; for(int i = 1; i < = n; i++) { for(int j = 0; j < maxm; j++) { int x = a[i] ^ j; dp[now][x] = dp[pre][x] + dp[pre][j]; } swap(now, pre); } LL ans = 0; for(int i = m; i < maxm; i++) { ans += dp[pre][i]; } printf("Case #%d: %lld ", k, ans); } return 0; }
推荐阅读
- Android异步框架RxJava 1.x系列 - 事件及事件序列转换原理
- 关于升级到Android Studio3.2版本的注意事项
- Android的15大最佳慢动作视频应用软件下载推荐(你最喜欢哪个())
- Android和iOS的15款最佳戒烟应用软件下载推荐(哪款适合你())
- Android和iOS的10个最佳对讲机应用软件下载推荐(你需要哪个())
- 10款最佳VR耳机推荐合集(你喜欢哪些(哪些值得你购买?))
- Android的10款最佳免费海报制作应用软件下载推荐合集
- Windows 10常用的10个最佳FTP客户端下载合集(哪个最好用())
- 最佳Adob??e Illustrator插件和扩展下载推荐合集(你最喜欢哪些())