题意:给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. Java中Office(word/ppt/excel)转换成HTML实现

    运行条件:JDK + jacob.jar + jacob.dll 1) 把jacob.dll在 JAVA_HOME\bin\ 和 JAVA_HOME\jre\bin\ 以及C:\WINDOWS\sys ...

  2. linux下gedit读取txt乱码解决办法

    修改一下gedit的设置来让它显示的txt不再是乱码: 你可以通过以下步骤,使 gedit 正确显示中文编码文件. 按下 Alt-F2,打开“运行应用程序”对话框.在文本框中键入“gconf-edit ...

  3. _beginThreadex创建多线程解读【转】

    _beginThreadex创建多线程解读 一.需要的头文件支持 #include <process.h>         // for _beginthread() 需要的设置:Proj ...

  4. mac os 基本命令

    unix 系统命令行 ,仅供参考   目录操作   命令名 功能描述 使用举例   mkdir 创建一个目录 mkdir dirname   rmdir 删除一个目录 rmdir dirname   ...

  5. 联不上网 Unable to initialize Windows Sockets interface. General failure.

    电脑莫名联不上网 Unable to initialize Windows Sockets interface. General failure. Unable to initialize the W ...

  6. h5的特点

    关于HTML面试题汇总之H5   一.H5有哪些新特性,移除了哪些元素?如何处理h5新标签的浏览器兼容性问题,如何区分html和html5 1. html5不在是SGL(通用标记语言)的一个子集,而包 ...

  7. SMT 的基本流程?SMT的工艺流程?SMT的设备操作?

    一.SMT工艺流程------单面组装工艺来料检测 --> 丝印焊膏(点贴片胶)--> 贴片 --> 烘干(固化) --> 回流焊接 --> 清洗 --> 检测 - ...

  8. am335x 虚拟机环境变量的设置及注释

    我用的还是老的Linux3.2.0的内核,只是借用了TI am335x SDK 3.0里面的工具. 首先下载TI官方的SDK,上一章已经安装了一个Ubuntu14.04的虚拟机. TI 最新的SDK下 ...

  9. BZOJ 2448: 挖油

    Description [0,x]中全是1,其余全是0,每个点有一个权值,求最坏情况下得到x的最小权值. Sol DP+单调队列. 首先就是一个 \(O(n^3)\) 的DP. \(f[i][j]\) ...

  10. JVM(java 虚拟机)内存设置

    一.设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xms   Ja ...