luogu 6046 纯粹容器 期望dp
时间:2020-04-25
本文章向大家介绍luogu 6046 纯粹容器 期望dp ,主要包括luogu 6046 纯粹容器 期望dp 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
LINK:纯粹容器
一道比较不错的期望题目。
关键找到计算答案的方法。
容易发现对于每个点单独计算答案会好处理一点。
暴力枚举在第k轮结束统计情况 然后最后除以总方案数即可。
考虑在第k轮的时候结束 我们要求出其所有的方案。
首先一个点在第k轮结束必须要有一个点在第k轮和它相遇。
如果暴力枚举这个点的话可能有不合法的方案 也不太容易进行计算。
容易发现击败某个点的点在左边或者右边 分别设为l,r.
考虑最后一定是 il或者ir这段点都没了。
如果l/r被击败了 也不影响解决 所以我们只关心il或者ir这两端所造成的方案数。
考虑如果是被左边击败了 设为calc(i-l,j).含义表示这i-l轮在前j轮中出现了。
仔细分析这个东西的含义 其实i可能在前j轮中的任意一轮都出现了 但是此时我们强制其在第j轮出现 那么减掉出现在1~j-1轮的方案数即可。
考虑calc(i-l,j)怎么计算:我的计算方法是 C(j,i-l)fac[i]C(n-1-i,j-i)fac[j-i]fac[n-1-j].
值得一提的是 如果同时可以被两边击败那么方案为 calc(i-l,j)+calc(r-i,j)不难发现有重复的地方发生。
即此时已经被左边击败了可是计算的确是右边的方案数反之同理 所以要减掉两边被同时击败的方案数C(r-l,j).
const ll MAXN=300010,G=3;
ll n;
ll fac[MAXN],inv[MAXN],a[MAXN],w[MAXN];
inline ll ksm(ll b,ll p)
{
ll cnt=1;
while(p)
{
if(p&1)cnt=(ll)cnt*b%mod;
b=(ll)b*b%mod;
p=p>>1;
}
return cnt;
}
inline ll C(ll a,ll b){if(a<b)return 0;return fac[a]*inv[b]%mod*inv[a-b]%mod;}
inline ll calc(ll i,ll j){if(j<i)return 0;return C(j,i)*C(n-1-i,j-i)%mod*fac[i]%mod*fac[j-i]%mod;}
signed main()
{
freopen("1.in","r",stdin);
get(n);fac[0]=1;
rep(1,n,i)get(a[i]),fac[i]=fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);
fep(n-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
//cout<<calc(1,2)<<endl;
rep(1,n,i)
{
ll l=0,r=0,ans=0;
fep(i-1,1,j)if(a[j]>a[i]){l=j;break;}
rep(i+1,n,j)if(a[j]>a[i]){r=j;break;}
if(!l&&!r){printf("%d ",n-1);continue;}
int las=0;
rep(1,n-1,j)
{
if(!l)
{
ans=(ans+((calc(r-i,j)*fac[n-1-j])-las)%mod*(j-1))%mod;
las=(calc(r-i,j)*fac[n-1-j])%mod;
//putl(calc(r-i,j));//putl(calc(r-i,j-1));
}
if(!r)
{
ans=(ans+(calc(i-l,j)*fac[n-1-j]-las)%mod*(j-1))%mod;
las=calc(i-l,j)*fac[n-1-j]%mod;
}
if(l&&r)
{
ans=(ans+((calc(i-l,j)+calc(r-i,j)-calc(r-l,j))*fac[n-1-j]-las)%mod*(j-1))%mod;
las=((calc(i-l,j)+calc(r-i,j)-calc(r-l,j))*fac[n-1-j])%mod;
}
}
ans=ans*inv[n-1]%mod;
printf("%lld ",(ans+mod)%mod);
}
return 0;
}
原文地址:https://www.cnblogs.com/chdy/p/12774506.html
- JS中const、var 和let的区别
- 动态计算rem的js代码
- 阻止浏览器冒泡事件,兼容firefox和ie
- JS使用循环按指定倍数分割数组组成新的数组的方法
- HttpServletRequest.getParameter()出现乱码现象解决方案
- 海量数据迁移之外部表加载(100天)
- Vue.js实现一个SPA登录页面的过程
- vue实现侧边栏手风琴效果
- 关于vue的使用计算属性VS使用计算方法的问题
- 如何在vue中使用sass
- vue -- v-cloak解决刷新或者加载出现闪烁(显示变量)
- jquery实现上下滑动选择
- echarts图表里label文字过长换行的方法
- 获取Object对象的length
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下Mysql定时任务备份数据的实现方法
- Linux系统下快速配置HugePages的完整步骤
- 解决Linux Tensorflow2.0安装问题
- 工作中常用到的Linux命令总结
- Linux中把用户添加到组的4个方法总结
- Linux下配置jdk环境的方法
- Ubuntu 16.04/18.04 安装Pycharm及Ipython的教程
- linux系统对外开放3306、8080等端口,防火墙设置详解
- Linux中selinux基础配置教程详解
- Linux中如何查看已挂载的文件系统类型详解
- 在 Linux 命令行中使用 tcpdump 抓包的一些功能
- CentOS平台快速搭建LAMP环境的方法
- Linux系统中时间的获取和使用
- 基于Linux搭建Apache网站服务配置详解
- CentOs下手动升级node版本的方法