先是看错题意。。然后知道题意之后写了发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)的更多相关文章

  1. HDU 4945 2048(DP)

    HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...

  2. bzoj 3851: 2048 dp优化

    3851: 2048 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 22  Solved: 9[Submit][Status] Description T ...

  3. HDU 4945 2048 DP 组合

    思路: 这个题写了一个背包的解法,超时了.搜了下题解才发现我根本不会做. 思路参见这个: 其实我们可以这样来考虑,求补集,用全集减掉不能组成2048的集合就是答案了. 因为只要达到2048就可以了,所 ...

  4. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  5. HDU 4945 2048(dp)

    题意:给n(n<=100,000)个数,0<=a[i]<=2048 .一个好的集合要满足,集合内的数可以根据2048的合并规则合并成2048 .输出好的集合的个数%998244353 ...

  6. zoj3802:easy 2048 again(状压dp)

    zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...

  7. 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 ...

  8. hdu 4945 2048 (dp+组合的数目)

    2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  9. ZOJ 3802 Easy 2048 Again 像缩进DP

    链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...

随机推荐

  1. python 校招信息爬虫程序

    发现一个爬虫程序,正在学习中: https://github.com/lizherui/spider_python

  2. WPF自定义控件(一)——Button

    接触WPF也有两个多月了,有了一定的理论基础和项目经验,现在打算写一个系列,做出来一个WPF的控件库.一方面可以加强自己的水平,另一方面可以给正在学习WPF的同行一个参考.本人水平有限,难免有一些错误 ...

  3. Oracle Study Note : Tablespace and Data Files

    1.how to create a tablespace that employs the most common features create tablespace tb_name #create ...

  4. word超链接显示HYPERLINK

    在word中编辑超链接后显示的并不是正常的超链接 正常的超连接 非正常显示 解决办法: 文件---选项----高级,如下图 将“显示域代码而非值域”前面的勾去掉.

  5. 配置DB2的数据库ODBC连接

    打开cmd窗口,输入db2cmd启动db2 clp窗口 输入db2 list node directory查看是否有数据库需要连接的节点 如果不存在,则 节点编目:db2 catalog tcpip ...

  6. [原创] PostgreSQL Plus Advanced Server在Windows中配置双机热备流复制

    一.系统环境 操作系统:Windows Server 2003/2008 两个节点分别为master与slave. 主节点master:172.27.19.28 备机点slave:172.27.19. ...

  7. Python实现NN(神经网络)

    Python实现NN(神经网络) 参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch 运行环境 Pyhton3 numpy(科学计算 ...

  8. 创建并配置Filter

    创建Filter需要两个步骤: 创建FIlter处理类. web.xml文件中配置Filter. 创建Filter类 创建Filter必须实现javax.servlet.Filter接口,在该接口中定 ...

  9. Android L Camera2 API 使用实例程序汇总

    在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-C ...

  10. 读《JavaScript语言精粹》的一些感言

    最近看了<JavaScript语言精粹>,并且连着看了两遍,如果非要用言语形容的话,那我只能用4个字来形容:相见恨晚.其中的一些经验经过这么多年的摸索其实也了然,但是作者用这么浅薄的书把有 ...