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

比赛的时候想着1跟3可以合并成4 。。。。然后就越搞越复杂了。。。。。2048玩得不多的我没有透彻的合并规则概念。。。。。

看了题解写了发,妥妥地TLE...本地随意n=100,000都TLE了。。。

用dp[i][j]表示当前 i个2^j 的方案数

然后队友提醒优化,就是,当枚举到比如,value = 2^j 当value是2048的时候,i>=1的都压到1那里去,类似于此。(第45行、第52行)

然后就快很多了,本地那些数据每个case都卡顿一下就出来了。。。提交。还是TLE.....

然后再改一改剪枝,就是压的那一部分可以直接压。(第55-60行)

终于AC....1015ms。。。泪牛满面。。。。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ll long long
#define maxn 100010
#define mod 998244353 ll qmod(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 nn[maxn],mm[maxn];
ll C(int n,int m){
return nn[n]*mm[m]%mod*mm[n-m]%mod;
}
int cnt[2055];
ll dp[2055][12];
int ma[12];
int main(){
nn[0]=mm[0]=1;
for(int i=1;i<maxn;++i) nn[i]=nn[i-1]*i%mod, mm[i]=qmod(nn[i],mod-2);
ma[11]=1;
for(int i=10;i>=0;--i)ma[i]=ma[i+1]*2;
int ca=0;
int n;
while(~scanf("%d",&n) && n){
printf("Case #%d: ",++ca);
for(int i=0;i<=11;++i) cnt[1<<i]=0;
int oth=0;
for(int i=0;i<n;++i){
int tmp; scanf("%d",&tmp);
if((tmp&(-tmp))==tmp && tmp) ++cnt[tmp];
else ++oth;
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int j=0;j<11;++j){
for(int i=0;i<=ma[j];++i){
if(dp[i][j]==0) continue;
int sumc=0;
for(int k=0;k<=cnt[1<<j];++k){
int cc=C(cnt[1<<j],k);
sumc+=cc;
if(sumc>=mod) sumc-=mod;
int ik2=min( (i+k)/2, ma[j+1] );
dp[ik2][j+1]+=dp[i][j]*cc%mod;
if(dp[ik2][j+1]>=mod) dp[ik2][j+1]-=mod;
if(ik2==ma[j+1]){
int ccc = qmod(2,cnt[1<<j]) - sumc;
if(ccc<mod) ccc+=mod;
dp[ik2][j+1]+=dp[i][j]*ccc%mod;
if(dp[ik2][j+1]>=mod) dp[ik2][j+1]-=mod;
break;
}
}
}
}
ll ans=dp[1][11];
ans = ans*qmod(2,oth)%mod + ( cnt[2048]? (qmod(2,cnt[2048])-1+mod)%mod*qmod(2,n-cnt[2048])%mod : 0 );
if(ans>=mod) ans-=mod;
printf("%I64d\n",ans);
}
return 0;
}

  

HDU 4945 2048(dp)的更多相关文章

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

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

  2. HDU 4433 locker(DP)(2012 Asia Tianjin Regional Contest)

    Problem Description A password locker with N digits, each digit can be rotated to 0-9 circularly.You ...

  3. HDU 3008 Warcraft(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3008 题目大意:人有100血和100魔法,每秒增加 t 魔法(不能超过100).n个技能,每个技能消耗 ...

  4. hdu 2059 龟兔赛跑(dp)

    龟兔赛跑 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成 ...

  5. HDU 4832 Chess (DP)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. HDU 2340 Obfuscation(dp)

    题意:已知原串(长度为1~1000),它由多个单词组成,每个单词除了首尾字母,其余字母为乱序,且句子中无空格.给定n个互不相同的单词(1 <= n <= 10000),问是否能用这n个单词 ...

  7. hdu 2571 命运(dp)

    Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个 ...

  8. HDU 6170----Two strings(DP)

    题目链接 Problem Description Giving two strings and you should judge if they are matched.The first strin ...

  9. HDU 2159 FATE (dp)

    FATE Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

随机推荐

  1. 关于Mysql错误:./bin/mysqld_safe --user=mysql& [1] 32710 121003 16:40:22 mysqld_safe Logging to '/var/log/mysqld.log'. 121003 16:40:22 mysqld_s

    [root@www]# ./bin/mysqld_safe --user=mysql&[1] 32710[root@www]# 121003 16:40:22 mysqld_safe Logg ...

  2. 【Solr】copy字段的应用

    目录 界面查询应用 熟悉Schema.xml copy域的应用 回到顶部 界面查询应用 添加一个文档 查询添加的文档 以上详细介绍了query里面的参数详解. 当不输入任何条件时,进行查询,看看返回结 ...

  3. nyoj 91 阶乘之和(贪心)

    阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...

  4. 一张图告诉你,只会JavaScript还不够!

    会了JavaScript语法,你就真的会了JavaScript吗,来看这张图!是超实用的JavaScript代码段一书的导览!熊孩子们,赶紧学习去吧!

  5. [原创]svn 常见错误总结

    错误: Unable to make name in 'X:\nfs\drivers\can_uart\.svn\tmp' 解决: 改变当前文件夹的权限 linux 下显示修改的文件名 参考链接:ht ...

  6. 第一篇博客 iframe自适应高度

    $('iframe').load(function(){    $(this).height($(this).contents().find(document).height())})这样就适应里面内 ...

  7. [codeforces 339]E. Three Swaps

    [codeforces 339]E. Three Swaps 试题描述 Xenia the horse breeder has n (n > 1) horses that stand in a ...

  8. 跟着百度学PHP[4]OOP面对对象编程-6-封装性private

    所谓封装顾名思义,如同箱子般给封装起来.结合前面的来说就是对属性或者方法,封装后的方法或属性只能有类内部进行调用.外部调用不了. 封装性的好处: 1.信息隐藏 2.http://www.cnblogs ...

  9. SQL手册

    来自 W3School 的 SQL 快速参考.可以打印它,以备日常使用. SQL 语句 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE ...

  10. jdk 1.7 在ubuntu 环境配置

    在/opt/里解压了jdk 1.7后 设置环境变量 chen@caicai ~ $ vim .profile export JAVA_HOME=/opt/jdk1..0_79 export JRE_H ...