[CSP-S模拟测试]:玩具(概率DP)
题目描述
这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候。
$IcePrince\text{_}1968$最近迷上了一种玩具,这种玩具中有两种零件:圆球和棍子。棍子的两头可以插在两个圆球上的各一个空洞中,从而将两个圆球连接起来。为了保证玩具的娱乐性,任意一个圆球上的空洞个数总是多于玩具套装中的棍子数。你可以认为圆球是没有体积的,所有棍子的长度均为$1$。
$IcePrince\text{_}1968$喜欢这样玩这种玩具:他先摸出玩具袋里的一个圆球放在地上,然后重复下面的操作$n-1$次:每次从袋中取出一个圆球和一根棍子,然后等概率的从地上的圆球中选择一个,将该圆球和选择的圆球用棍子连起来,使得新的圆球在选中圆球的正上方。
$IcePrince\text{_}1968$对自己搭出的艺术品很满意,便决定把这个物品送给$IcePrincess\text{_}1968$作为生日礼物。然而生日礼物是需要包装的,因为默认圆球没有体积,所以$IcePrince\text{_}1968$不用考虑包装盒的长和宽,但是包装盒的高是需要确定的,这里我们假设$IcePrince\text{_}1968$是一个非常节俭的孩子,所以包装盒的高总是等于艺术品的高度。$IcePrince\text{_}1968$想知道自己需要的包装盒的高的期望对质数$p$取模后的值,但他还在上幼儿园,怎么会算呢,于是就请你来帮助他。
输入格式
输入文件名为$toy.in$。
输入数据仅一行,包含两个正整数$n,p$,表示最终的艺术品中圆球的个数和模数$p$。
输出格式
输出文件名为$toy.out$。
输入文件仅一行,一个正整数,表示包装盒的高的期望对质数$p$取模后的值。
样例
样例输入:
3 998244353
样例输出:
499122178
数据范围与提示
样例解释:
三个圆球组成的艺术品,高度只可能是$1$或者$2$,所以高度的期望是$1.5$,在模$998244353$下的期望是$499122178$。
数据范围:
对于$30\%$的数据,满足$n\leqslant 10,p\leqslant 1,000,007$;
对于$50\%$的数据,满足$n\leqslant 20$;
对于$70\%$的数据,满足$n\leqslant 50$;
对于$100\%$的数据,满足$n\leqslant 200,p\leqslant 1,000,000,007$,$p$是质数。
题解
超级神奇的$DP$,先作出如下定义:
$\alpha.$设$dp[i][j]$表示$i$个点的森林,有$j$个点在第一棵树的概率。
$\beta.$设$f[i][j]$表示有$i$个点的树,深度不超过$j$的概率。
$\gamma.$设$g[i][j]$表示有$i$个点的森林,深度不超过$j$的概率。
那么,先考虑如何求出$dp$数组,有:
$$dp[i][j]=dp[i-1][j-1]\times\frac{j-1}{i}+dp[i-1][j]\times\frac{i-j}{i}$$
初始化$dp[1][1]=1$。
解释一下,式子的前一半是将新加入的点放入了第一棵树,那么它可以接到$(j-1)$个点上, 后一半是将新加入的这个点放入了除第一棵树外的其它树上(也可以新建一棵树),分母是$i$而不是$(i-1)$的是由于这个点可以新建一棵树,也就是相当于跟谁也没有相接。
接着考虑一个式子:
$$f[i][j]=g[i-1][j-1]$$
化个图你就理解了$\downarrow$
$$\Downarrow$$
也就是说,我们加了一个点,让这棵森林中的所有树都连到了这个节点上。
再来考虑如何求出$g$数组:
$$g[i][j]=\sum \limits_{k=1}^if[k][i]\times g[i-1][j]\times dp[i][k]$$
这相当于是在$i$个点中选取了$k$个点组成第一棵树,剩下$k$个点还是一个森林,$dp[i][k]$相当于是系数,也就是这第一棵树的形态数。
最后,因为$f$数组的意义是$f[i][j]$有$i$个点的树,深度不超过$j$的概率;所以我们需要知道深度恰好为$j$的概率,即为$f[n][j]-f[n][j-1]$。
将每一个深度的概率乘上其深度再加和即为答案。
时间复杂度:$\Theta(n^3)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,p;
long long inv[201];
long long dp[201][201],f[201][201],g[201][201];
long long ans;
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x%p;
x=x*x%p;
y>>=1;
}
return res;
}
int main()
{
scanf("%d%d",&n,&p);
dp[1][1]=f[1][0]=1;
for(int i=1;i<=n;i++)inv[i]=qpow(i,p-2);
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=(dp[i-1][j-1]*(j-1)%p+dp[i-1][j]*(i-j)%p)*inv[i]%p;
for(int i=0;i<=n;i++)g[0][i]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++)
{
if(j)f[i][j]=g[i-1][j-1];
for(int k=1;k<=i;k++)g[i][j]=(g[i][j]+f[k][j]*g[i-k][j]%p*dp[i][k]%p)%p;
}
for(int i=1;i<=n;i++)ans=(ans+(f[n][i]-f[n][i-1]+p)%p*i%p)%p;
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:玩具(概率DP)的更多相关文章
- [CSP-S模拟测试]:题(DP)
题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...
- [CSP-S模拟测试]:tree(DP)
题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...
- 2018.10.17 NOIP模拟 发电机(概率dp)
传送门 考试空间开大了爆零不然只有30分爆栈? 话说这题真的坑1e7没法写dfsdfsdfs 其实很好推式子. 考虑每个点安一个发动机的概率,推一波式子做个等比数列求和什么的可以证明出来是严格的1si ...
- NOIP模拟 赌博游戏 - 概率dp
题意: 最近西雅图的高中校园里流行这样一个游戏. 我们有一个骰子,这个骰子有M个面,分别写着1..M,并且是个公平的骰子,换句话说,一次投掷时每个面朝上的概率是相同的. 游戏的组织者使用这个骰子进行N ...
- [CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...
- [CSP-S模拟测试]:蛇(DP+构造+哈希)
题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...
- [CSP-S模拟测试]:最小值(DP+乱搞)
题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...
- [CSP-S模拟测试]:花(DP)
题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...
- [CSP-S模拟测试]:计数(DP+记忆化搜索)
题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...
随机推荐
- SQL Server之索引解析(二)
1.堆表 堆表通过IAM连接一起,查询时全表扫描. 1.1 非聚集索引 结构 叶子节点数据结构:行数据结构+Rid(8字节) 中间节点数据结构: (非聚集非唯一索引)行数据结构+Page(4)+2+ ...
- [LeetCode] 45. 跳跃游戏 II
题目链接 : https://leetcode-cn.com/problems/jump-game-ii/ 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位 ...
- bootstrap使用总结(carousel设置大小。item设置大小,img设置大小)
在bootstrap中使用carousel,先要给.carousel一个大小, 要想使carousel和item和img随着浏览器大小而变,就要设置 .carousel .item { height: ...
- T-聊天止于呵呵
(现代版)俗话说:流言止于智者,聊天止于呵呵.输入一段聊天记录,你的任务是数一数有 多少段对话“止于呵呵”,即对话的最后一句话包含单词 hehe 或者它的变形. 具体来说,我们首先提取出对话的最后一句 ...
- RocksDB Rate Limiter源码解析
这次的项目我们重点关注RocksDB中的一个环节:Rate Limiter.其实Rate Limiter的思想在很多其他系统中也很常用. 在RocksDB中,后台会实时运行compaction和flu ...
- [UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐
原文:[UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐 1. 什么是BlendEffect# 上一篇文章介绍了CompositionLinea ...
- 剑指offer-二叉搜索树与双向链表-python
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.. # -*- coding:utf-8 -*- # class TreeN ...
- django模板传入参数的处理方式与反向生成url
前端模板传入参数的处理方式 1.传入单个参数: 前端使用href="/sel-{{ row.0 }}.html, url使用url(r'sel-(.+).html',home.index), ...
- linux中文件权限格式与chmod命令以及用户和用户组的管理
简单了解一下linux中的文件权限格式与chmod命令 chmod命令:改变文件或者目录的权限 格式:chmod [参数] [<权限范围><符号><权限代码>] - ...
- Docker 启动与停止容器
启动已运行过的容器 docker start 容器名称|容器id 如: docker start mycentos 启动所有运行过的容器(注意:反单引号` `), docker ps -a -q 是查 ...