HDU4945 2048(dp)
先是看错题意。。然后知道题意之后写了发dp..无限TLE..实在是不知道怎么优化了,跑了遍数据是对的,就当作理论AC掉好了。。
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std; #define ll long long
#define maxn 120000
#define mod 998244353 ll mod_pow(ll a, ll n){
ll ret = 1;
while (n){
if (n & 1) ret = ret*a%mod;
a = a*a%mod;
n >>= 1;
}
return ret;
} ll fac[maxn];
ll fac_inv[maxn]; int cnt[2500];
int dp[13][2500];
int two[13] = { 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 };
int two_com[13] = { 0, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1 };
int n; inline int getint() {
int ret = 0; bool ok = 0;
for (;;) {
int c = getchar();
if (c >= '0'&&c <= '9')ret = (ret << 3) + ret + ret + c - '0', ok = 1;
else if (ok)return ret;
}
} inline ll comb(int n, int m){
return fac[n] * fac_inv[m] % mod*fac_inv[n - m] % mod;
}
inline void add(int &a, int b){
a += b;
if (a >= mod) a -= mod;
} int main()
{
//freopen("1001.in", "r", stdin);
//freopen("out.txt", "w", stdout);
//double t1 = clock();
fac[0] = fac_inv[0] = 1;
for (int i = 1; i <= 100000; ++i){
fac[i] = fac[i - 1] * i%mod;
}
fac_inv[100000] = mod_pow(fac[100000], mod - 2);
for (int i = 99999; i >= 0; --i){
fac_inv[i] = fac_inv[i + 1] * (i + 1) % mod;
}
int ca = 0;
while (~scanf("%d", &n) && n){
for (int i = 1; i <= 12; ++i) cnt[two[i]] = 0;
int tmp;
for (int i = 0; i < n; ++i) {
tmp = getint();
cnt[tmp]++;
}
int pn = 0;
for (int i = 1; i <= 12; ++i) pn += cnt[two[i]];
memset(dp, 0, sizeof(dp)); dp[0][0] = 1;
ll sum,cb;
for (int i = 1; i <= 12; ++i){
int num = cnt[two[i]];
for (int j = 0; j <= two_com[i - 1]; ++j){
sum = 0;
int k;
for (k = 0; (j >> 1) + k <= two_com[i] && k <= num; ++k){
cb = comb(num, k);
sum = sum + cb; if (sum >= mod) sum -= mod;
add(dp[i][(j >> 1) + k], dp[i - 1][j] * cb%mod);
}
if ((j >> 1) + num > two_com[i]){
ll res = ((mod_pow(2, num) - sum) % mod + mod) % mod;
add(dp[i][two_com[i]], res*dp[i - 1][j] % mod);
}
}
}
ll ans = dp[12][1] * mod_pow(2, n - pn) % mod;
printf("Case #%d: %I64d\n", ++ca, ans);
}
//double t2 = clock();
//cout << t2 - t1 << endl;
return 0;
}
HDU4945 2048(dp)的更多相关文章
- HDU 4945 2048(DP)
HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...
- bzoj 3851: 2048 dp优化
3851: 2048 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 22 Solved: 9[Submit][Status] Description T ...
- HDU 4945 2048 DP 组合
思路: 这个题写了一个背包的解法,超时了.搜了下题解才发现我根本不会做. 思路参见这个: 其实我们可以这样来考虑,求补集,用全集减掉不能组成2048的集合就是答案了. 因为只要达到2048就可以了,所 ...
- ZOJ3802 Easy 2048 Again (状压DP)
ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- HDU 4945 2048(dp)
题意:给n(n<=100,000)个数,0<=a[i]<=2048 .一个好的集合要满足,集合内的数可以根据2048的合并规则合并成2048 .输出好的集合的个数%998244353 ...
- zoj3802:easy 2048 again(状压dp)
zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...
- Easy 2048 Again - ZOJ 3802 像缩进dp
Easy 2048 Again Time Limit: 2 Seconds Memory Limit: 65536 KB Dark_sun knows that on a single-tr ...
- hdu 4945 2048 (dp+组合的数目)
2048 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- ZOJ 3802 Easy 2048 Again 像缩进DP
链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...
随机推荐
- SQL中的内连接外连接和交叉连接是什么意思?
内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接( ...
- Media Player(APP)
今天共享一下,以前做的影音播放器.比较简单.适合新手. 我上传了附件可以参考一下. PDF:http://files.cnblogs.com/files/hongguang-kim/MediaPlay ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 线段树区间更新: 1. 区间同同时加上一个数 2. 区间同时乘以一个数 #inclu ...
- Oracle ODP.NET连接池
数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...
- Golang之ring.Ring的Link操作
ring.Ring 是一个环链. 其Link操作规则是: r.Link(s) => t = r.Next r.Next.Prev = s.Prev s.Prev.Next = r.Next r. ...
- IOS内存管理「2」- 点语法的内存管理
- C语言中链表节点的实现,以及如何实现泛型
1.C语言中的struct是纯粹的结构体,没有访问权限的概念 2.C语言中用void* 来实现泛型编程,也是C++类和模板底层实现的基础,就是用void*来实现的 #include<stdio. ...
- ThinkPHP运算符与PHP运算符对照表
ThinkPHP运算符与PHP运算符对照表 ThinkPHP标签 说明及对应PHP标签 备注 eq 等于(=)(==:用于模板判断时) 可用于查询条件与模板判断 neq 不等于(!=) 可用于查询条件 ...
- 结对开发:7-magic用户调研报告
用户调研报告 班级 信1201-2班 学号 20122929 姓名 崔乐乐 项目名称:7-magic 调研时间: 2015/4/14 调研主题:7-magic游戏的用户需求度调研 ...
- 为什么X86汇编中的mov指令不支持内存到内存的寻址?
在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了? ...