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 ...
随机推荐
- Android去除CPU占用过高时屏幕四周闪红框
话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...
- rails 学习笔记
bundle package #保存gem到 vendor/cache bundle install –local 从cache从安装 升级rails bundle config –delete ...
- wpf做的可扩展记事本
记得有个winform利用反射做的可扩展笔记本,闲来无事,便用wpf也搞了个可扩展记事本,可用接口动态扩展功能,较简单,以便参考: 目录结构如下: MainWindow.xaml为主功能界面,Func ...
- CF 191 总结
A. Flipping Game 链接:http://codeforces.com/contest/327/problem/A 题意:从 i 到 j 翻转一次使得 1 的 个数最多~ 直接暴力搞~ # ...
- bhrs报表年结步骤
--前期准备数据三个表数据: s_subjtotal_year, subject_item, branch ,decrsubjtotal---informix 查看数据库剩余空间select d.na ...
- OpenStack:安装Horizon
1. 安装:# apt-get install memcached libapache2-mod-wsgi openstack-dashboard!Note for Ubuntu users# apt ...
- 使用 PHP cURL 提交 JSON 数据
http://www.oschina.net/code/snippet_54100_7351 http://www.lornajane.net/posts/2011/posting-json-data ...
- MVC4.0 实现单一Action返回多种结果
在开发过程中,我们往往会遇到这种情况.例如:展示学生的详细信息页面,加载学生的详细信息局部视图,异步请求学生的详细信息Json数据等等. 一般情况下,我们会写三个不同的action来支撑前台数据的调用 ...
- shell if判断的种类
if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" ...
- tcp传输黏包
tcp传输黏包 tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带 ...