HDU 4945 2048 DP 组合
思路:
这个题写了一个背包的解法,超时了。搜了下题解才发现我根本不会做。
思路参见这个:
其实我们可以这样来考虑,求补集,用全集减掉不能组成2048的集合就是答案了。
因为只要达到2048就可以了,所以求补集会大大减小枚举的次数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <cctype>
#include <time.h> using namespace std; typedef __int64 ll; const int INF = <<;
const int MAXN = 1e5+;
const int MAXM = ;
const ll MOD = ; int cnt[MAXM];
ll dp[][MAXM];
ll fact[MAXN], inv[MAXN];
int n; ll myPow(ll x, int d) {
ll res = ;
while (d>) {
if (d&) res = (res*x)%MOD;
x = (x*x)%MOD;
d >>= ;
}
return res;
} inline ll C(int x, int y) {
return ((fact[x]*inv[y])%MOD * inv[x-y])%MOD;
} inline int lowBit(int x) {
return x&(-x);
} void solve() {
int sum = n;
for (int i = ; i < ; i++) sum -= cnt[<<i]; memset(dp, , sizeof(dp)); for (int j = min(, cnt[]); j >= ; j--) dp[][j] = C(cnt[], j); for (int i = ; i < ; i++) {
int cc = >>i;
for (int k = min(cc, cnt[<<i]); k >= ; k--) { //选k个
ll CC = C(cnt[<<i], k);
for (int j = k; j <= cc; j++) { //
dp[i][j] = (dp[i][j] + (((dp[i-][(j-k)<<]+dp[i-][(j-k)<<|])%MOD)*CC)%MOD )%MOD;
}
}
} ll ans = ((myPow(, n-sum)-dp[][])%MOD+MOD)%MOD;
ans = (ans*myPow(, sum))%MOD;
printf("%I64d\n", ans);
} int main() {
#ifdef Phantom01
freopen("HDU4945.txt", "r", stdin);
#endif //Phantom01 fact[] = ;
for (int i = ; i < MAXN; i++) fact[i] = (fact[i-]*i)%MOD;
inv[MAXN-] = myPow(fact[MAXN-], MOD-);
for (int i = MAXN-; i > ; i--) inv[i-] = (inv[i]*i)%MOD; int T = ; while (scanf("%d", &n)!=EOF && n!=) {
printf("Case #%d: ", T++);
memset(cnt, , sizeof(cnt));
int x;
for (int i = ; i < n; i++) {
scanf("%d", &x);
cnt[x]++;
}
solve();
} return ;
}
HDU 4945 2048 DP 组合的更多相关文章
- HDU 4945 2048(DP)
HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...
- hdu 4945 2048 (dp+组合的数目)
2048 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- HDU 4945 2048(dp)
题意:给n(n<=100,000)个数,0<=a[i]<=2048 .一个好的集合要满足,集合内的数可以根据2048的合并规则合并成2048 .输出好的集合的个数%998244353 ...
- HDU 4945 (dp+组合数学)
2048 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4283 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
随机推荐
- [置顶]
Linux 常用命令集锦
出处:http://www.vaikan.com/what-are-the-most-useful-swiss-army-knife-one-liners-on-unix/ Linux命令行里的&qu ...
- Git:Git入门及基本命令
Git的结构: Git和代码托管中心 局域网环境下: 1)GitLab服务器 外网环境下: 2)github 3)码云 代码托管中心的任务:维护远程库 本地库和远程库的交互 团队内部协作 跨团队协作 ...
- CORS与JSONP的区别
CORS与JSONP: a. JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求. b. 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSON ...
- 题解 P1337 【[JSOI2004]平衡点 / 吊打XXX】
这道题调了好久,果然非洲人是得不到眷顾的吗... 本题采用模拟退火解决. 模拟退火是一种简洁明了而又高效的近似算法,基本上可以套到任何求最优解的题目上去. 它的原理是模拟物理中金属退火的现象,凭借选手 ...
- Mysql学习总结(35)——Mysql两千万数据优化及迁移
最近有一张2000W条记录的数据表需要优化和迁移.2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升.不过这些数据有大量的冗余字段和错误信息,极不 ...
- hbase的几种访问方式
Hbase的访问方式 1.Native Java API:最常规和高效的访问方式: 2.HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用: 3.Thrift Gat ...
- 利用新版本自带的Zookeeper搭建kafka集群
安装简要说明新版本的kafka自带有zookeeper,其实自带的zookeeper完全够用,本篇文章以记录使用自带zookeeper搭建kafka集群.1.关于kafka下载kafka下载页面:ht ...
- HDU 4308 Contest 1
纯BFS+优先队列扩展. #include <iostream> #include <cstdio> #include <cstring> #include < ...
- Knockout源代码精析-怎样解析demo元素,获取到bindings(二)?
接上文这里開始分析applyBindingsToNodeInternal.applyBindingsToNodeInternal方法例如以下: function applyBindingsToNode ...
- 14.boost最小生成树 kruskal_min_spainning_tree
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...