博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Happy Matt Friends
阅读量:5299 次
发布时间:2019-06-14

本文共 2407 字,大约阅读时间需要 8 分钟。

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

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 ≤ 10
6).
In the second line, there are N integers ki (0 ≤ k
i ≤ 10
6), 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.
 

 

Sample Input
2
3 2
1 2 3
3 3
1 2 3
 

 

Sample Output
Case #1: 4
Case #2: 2
Hint
In the first 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.
 
解题:dp计数
dp弱到渣啊!在码代码的猿猿巨巨指导下才搞定!
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #define LL long long15 #define INF 0x3f3f3f3f16 #define pii pair
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 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4130776.html

你可能感兴趣的文章
input提示文字;placeholder字体修改
查看>>
MyBatis知识点总结(一)
查看>>
面试题链接记录
查看>>
Android Studio 版本间区别
查看>>
SQL SERVER: 合并相关操作(Union,Except,Intersect)
查看>>
1025-完数
查看>>
汇编第二章知识总结
查看>>
负载均衡简单配置
查看>>
Informix Online数据库日常管理及维护
查看>>
Java反射机制demo(二)—通过Class实例化任意类的对象
查看>>
String和StringBuffer的区别
查看>>
eclipse 添加resources 目录
查看>>
shell 备份mysql
查看>>
ios 常见问题解决
查看>>
Gradle初使用
查看>>
Error: rpmdb open failed
查看>>
CentOS 常用命令合集
查看>>
CRUD操作
查看>>
[转帖]盖国强:Oracle 路线图
查看>>
今天很奇妙
查看>>