ssoj3984: 玩具(toy)

时间限制: 1 Sec 内存限制: 256 MB
提交: 40 解决: 22
[提交][状态][博客][加入收藏]
题目描述
这个故事发生在很久以前,在 IcePrincess_1968 和 IcePrince_1968 都还在上幼儿园的时候。

IcePrince_1968 最近迷上了一种玩具,这种玩具中有两种零件:圆球和棍子。棍子的两头可以插在两个圆球上的各一个空洞中,从而将两个圆球连接起来。为了保证玩具的娱乐性,任意一个圆球上的空洞个数总是多于玩具套装中的棍子数。你可以认为圆球是没有体积的,所有棍子的长度均为 1。

IcePrince_1968 喜欢这样玩这种玩具:他先摸出玩具袋里的一个圆球放在地上,然后重复下面的操作 n-1 次:每次从袋中取出一个圆球和一根棍子,然后等概率的从地上的圆球中选择一个,将该圆球和选择的圆球用棍子连起来,使得新的圆球在选中圆球的正上方。

IcePrince_1968 对自己搭出的艺术品很满意,便决定把这个物品送给 IcePrincess_1968 作为生日礼物。然而生日礼物是需要包装的,因为默认圆球没有体积,所以 IcePrince_1968 不用考虑包装盒的长和宽,但是包装盒的高是需要确定的,这里我们假设 IcePrince_1968 是一个非常节俭的孩子,所以包装盒的高总是等于艺术品的高度。IcePrince_1968 想知道自己需要的包装盒的高的期望对质数 p 取模后的值,但他还在上幼儿园,怎么会算呢,于是就请你来帮助他。

输入
输入数据仅一行,包含两个正整数 n,p,表示最终的艺术品中圆球的个数和模数 p。

输出
输入文件仅一行,一个正整数,表示包装盒的高的期望对质数 p 取模后的值。

样例输入
3 998244353
样例输出
499122178
提示
【输入输出样例 1 解释】

三个圆球组成的艺术品,高度只可能是 1 或者 2,所以高度的期望是 1.5,在模 998244353下的期望是 499122178。

【输入输出样例 2】

见选手目录下的 toy/toy2.in 和 toy/toy2.ans。

【数据规模与约定】

对于 30%的数据,满足 n<=10,p<=1,000,007;

对于 50%的数据,满足 n<=20;

对于 70%的数据,满足 n<=50;

对于 100%的数据,满足 n<=200,p<=1,000,000,007,p 是质数。

来源
noip2018模拟-南外

题解:
题意大概就是给一个根,每次等概率地向树的任意一个节点插入一个儿子,求树的期望高度。
考虑DP,然而直接按树上做怎么设计状态都难以转移,因为每一次插入都需要知道叶子节点的个数,而叶子节点个数的改变又要由第二层叶子节点来计算,以此类推,要记录整个树的形态,非多项式效率。
故我们考虑深林(我也不知道题解是如何想到的。。。大概是森林可以辅助树的转移,这样可以把问题转换到深林与树的关系上,从而避免维护树的形态吧。。。)。所以记f[i][j]为i个的树点深度不超过j的概率(至于为什么是不超过,大概就是为了避免考虑叶子节点个数的问题),g[i][j]为i个点的深林,深度不超过j的概率,那么考虑转移g,可以枚举第一颗树的节点数,然后转移,即g[i][j]=sigma(k)f[k][j]g[i-k][j](i个点,第一个字数有k个点的概率),故记dp[i][j]为i个点,第一个子树有j个点的概率,转移时考虑第i个点插在哪里,即dp[i][j]=dp[i-1][j-1]*(j-1)inv[i]+dp[i-1][j](i-j)*invi,而树可以拆掉根变为深林,故f[i][j]=g[i-1][j-1].

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值