Description

小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和。
但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案。
小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,
现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数。
注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<=j<=i

Input

第一行一个正整数nnn,表示序列长度。
第二行n个数,表示原序列a[1..n],第i个数表示a[i]。
1≤n≤20,Sigma(|Ai|)<=10^9,其中1<=i<=N

Output

输出一个非负整数,表示答案。

Sample Input

2
-1 2

Sample Output

3

Solution

首先对于一个序列$[a_1,a_n]$,设最大前缀和的位置为$p$,那么序列$[a_{p+1},a_n]$的任意一个前缀必须都$<=0$。否则的话你用最大前缀和随便加上$[a_{p+1},a_n]$中$>0$的一个前缀就可以得到新的最大前缀和。

预处理:

$sum[S]$表示集合$S$的数字和。

$f[S]$表示钦定集合$S$当最大前缀的合法方案数。

$g[S]$表示集合$S$任意前缀和$<=0$小于$0$的方案数。

那么显然$ans=\sum sum[S]\times f[S]\times g[S']$。其中$S'$是$S$的补集。

$sum$和$g$都是可以直接求的,那么$f$呢?

可以发现,如果$sum[S]>0$,那么把随便一个数放到这个集合$S$的最前面,这个最大前缀和仍然是可以保证合法的。

$ans$最后忘了取模$WA$了好几发……心态崩了

Code

 #include<iostream>
#include<cstdio>
#define N (21)
#define MOD (998244353)
using namespace std; int n,m,a[N],sum[<<N],cnt[<<N],f[<<N],g[<<N]; int main()
{
scanf("%d",&n); m=(<<n)-;
for (int i=; i<=n; ++i) scanf("%d",&a[i]);
for (int i=; i<=n; ++i)
for (int S=; S<=m; ++S)
if (S&(<<i-)) sum[S]+=a[i], cnt[S]++; for (int S=; S<=m; ++S)
{
if (cnt[S]==) {f[S]=; continue;}
for (int i=; i<=n; ++i)
if ((S&(<<i-)) && sum[S]-a[i]>)
(f[S]+=f[S^(<<i-)])%=MOD;
} g[]=;
for (int S=; S<=m; ++S)
{
if (sum[S]>) {g[S]=; continue;}
if (cnt[S]==) {g[S]=; continue;}
for (int i=; i<=n; ++i)
if (S&(<<i-))
(g[S]+=g[S^(<<i-)])%=MOD;
}
int ans=;
for (int S=; S<=m; ++S)
(ans+=1ll*sum[S]*f[S]%MOD*g[m^S]%MOD)%=MOD;
ans=(ans%MOD+MOD)%MOD;
printf("%d\n",ans);
}

BZOJ5369:[PKUSC2018]最大前缀和(状压DP)的更多相关文章

  1. [PKUSC2018]最大前缀和——状压DP

    题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...

  2. LOJ#6433. 「PKUSC2018」最大前缀和 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...

  3. LOJ 6433 「PKUSC2018」最大前缀和——状压DP

    题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...

  4. 【PKUSC2018】【loj6433】最大前缀和 状压dp

    这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...

  5. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP

    BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...

  6. 「PKUSC2018」最大前缀和(状压dp)

    前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...

  7. Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

    题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...

  8. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

  9. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

随机推荐

  1. 几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr

    1:Jquery 主页:http://jquery.com/ 设计思想:简洁的方案思想,几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性). ...

  2. SpringMVC拦截器和@ResponseBody注解冲突

    在使用@ResponseBody注解后controller方法只会返回ModelandView对象的数据模型,不会返回视图,这样有很多好处,但是如果在拦截器中进行了页面转发,在满足页面转发条件时,不会 ...

  3. CentOS 修改用户密码

    CentOS 修改用户密码 1.普通用户 ①获取超级用户root权限 命令:su 或者 su- 或者 su -root ②输入命令: passwd 用户名 ③输入新密码 2.超级用户 ①打开syste ...

  4. 安装 Java 开发工具包JDK(Windows版本)

    前言: 进行java开发,首先要安装jdk,安装完成之后,还需要进行环境变量配置,以下就介绍一下具体步骤 具体步骤: 1.进入官网(https://www.oracle.com/technetwork ...

  5. react单页面应用的Nginx配置问题

    项目中多数使用react单页面开发,路由使用react-router的browser-router,这样页面访问路径看起来像是真实的,如http://xx.xxx.xxx/a/b.但当项目访问路径为多 ...

  6. 8.2,常用模块介绍:sys,os,time,random

    sys: 介绍:主要包含涉及python编译器与系统交互的函数. 常用函数: import sys print(sys.argv)#本文件名,已经运行该程序时的参数 #[如在命令窗口中python3 ...

  7. oracle学习之pl/sql使用==转载

    PLSQL循序渐进全面学习教程(全):https://blog.csdn.net/spark998/article/details/2065269

  8. sql 经典面试题及答案(选课表)

    SQL数据库面试题以及答案 Student(Sno,Sname,Sage,Ssex) 学生表       Sno:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别Course(Cno ...

  9. 根据模板导出Excel报表并复制模板生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...

  10. innodb_file_per_table - 转换为InnoDB

    共享InnoDB / var / lib / mysql / ibdata1存储的问题InnoDB表当前将数据和索引存储到共享表空间(/ var / lib / mysql / ibdata1).由于 ...