[LOJ 6433][PKUSC 2018]最大前缀和

题意

给定一个长度为 \(n\) 的序列, 求把这个序列随机打乱后的最大前缀和的期望乘以 \(n!\) 后对 \(998244353\) 取膜后的值.

前缀和不能为空.

\(n\le 20\).

题解

首先这个期望显然是逗你玩的...只是计数而已

然后我们把一个序列拆成两部分, 一部分前缀和都不大于总和, 一部分前缀和都不大于 \(0\). 那么显然这样的一个序列的最大前缀和就是第一部分的和. 我们只要知道有多少个这样的序列就好了.

后面的做法感觉有点意思

我们用两个DP分别求解序列的某个子集组成两个部分的方案数量. 如果当前集合的和大于 \(0\) 那么显然不能用来组成第二部分, 但是我们可以在这个集合产生的合法第一部分的前面加一个值来组成新的第一部分. 而如果当前集合的和不大于 \(0\), 那么它只能用于构成第二部分, 而且我们可以断定如果在这个集合中钦定某个值放在最后, 那么只要剩下的值能构成合法的第二部分, 新的序列也能构成合法的第二部分.

最后枚举那些值在第一部分, 剩下值丢给第二部分, 卷起来就可以了.

参考代码

#include <bits/stdc++.h>

const int MAXN=21;
const int MOD=998244353;
const int MAXL=(1<<20)|3; int n;
int a[MAXN];
int dp1[MAXL];
int dp2[MAXL];
int sum[MAXL]; inline int LowBit(int); int main(){
scanf("%d",&n);
dp2[0]=1;
for(int i=0;i<n;i++){
scanf("%d",a+i);
dp1[1<<i]=1;
sum[1<<i]=a[i];
}
for(int s=1;s<(1<<n);s++){
if(s!=LowBit(s))
sum[s]=sum[s^LowBit(s)]+sum[LowBit(s)];
if(sum[s]>0){
for(int i=0;i<n;i++)
if((s&(1<<i))==0)
(dp1[s^(1<<i)]+=dp1[s])%=MOD;
}
else{
for(int i=0;i<n;i++)
if((s&(1<<i))!=0)
(dp2[s]+=dp2[s^(1<<i)])%=MOD;
}
}
int ans=0;
for(int s=1;s<(1<<n);s++)
(ans+=1ll*sum[s]*dp1[s]%MOD*dp2[((1<<n)-1)^s]%MOD)%=MOD;
printf("%d\n",ans<0?ans+MOD:ans);
return 0;
} inline int LowBit(int x){
return x&-x;
}

最新文章

  1. 频率直方图(hist)
  2. Eliot
  3. webssh software
  4. [oracle] ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
  5. HTML5图片拖拽预览原理及实现
  6. MySQL 5.7 Zip 安装(win7)
  7. SNMP协议总结
  8. bind的例子
  9. OpenCV2学习笔记02:MSVC2013搭建OpenCV开发环境
  10. JavaScript高级程序设计52.pdf
  11. Eclipse编译Arduino程序不能使用串口函数Serial.begin解决办法
  12. .net通用权限框架B/S(一)
  13. Asp.net 获取服务器指定文件夹目录文件,并提供下载
  14. Learning-Python【5】:Python数据类型(1)—— 整型、浮点型、字符串
  15. 【转】ubuntu 12.04下如何开启 NFS 服务 &amp; 设置
  16. MySql、Oracle、MSSQL中的字符串的拼接
  17. HTML 练习 做简历表
  18. VM下,装centos7系统,配置nginx的问题
  19. (转)MPEG4码流简单分析
  20. Chart图表整合——面积对比图、扇形图、柱状图

热门文章

  1. BERT-wwm、BERT-wwm-ext、RoBERTa、SpanBERT、ERNIE2
  2. Eclipse maven创建web项目报错Could not resolve archetype
  3. Zookeeper搭建集群及协同
  4. springboot整合shiro进行权限管理
  5. path()函数
  6. SQL Server设置数据库为状态为只读
  7. vue中的父子组件相互调用
  8. Linux常用命令之文件编辑命令vim
  9. .net core项目启动时报_未处理Socket异常(以一种访问权限不允许的方式做了一个访问套接字的尝试。)
  10. 如何访问到静态的文件,如jpg,js,css.