BZOJ5305: [HAOI2018]苹果树
果然只有我这种菜鸡才会用这种菜鸡做法QwQ
对于一类要求期望的题目,有一个无脑的做法:
设概率为 \(f\),期望为 \(g\)
每次合并两个二元组 \(<f_1,g_1>,<f_2,g_2>\) 的方法显然为 \(<f_1\times f_2,g_1\times f_2+f_1\times g_2>\)
对于这一道题,设 \(i\) 个点的树的方案数 \(f_i\),到根的距离和为 \(g_i\),距离总合 \(h_i\)
显然 \(f_i=i!\)
(我TM写了个这个东西\(f[0]=f[1]=1,f[i]=\sum f[j-1]f[i-j]\binom{i-1}{j-1}\)结果发现我是zz)
\(g_i\) 的合并要将左右的树的 \(g\) 分别加上 \(1\)
\(h_i\) 的合并要将左右的树的 \(g\) 分别加上 \(1\) 然后拼起来再加上左右的 \(h\)
最后 \(h_i\) 还要算上 \(g_i\)
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(2005);
int n, mod, c[maxn][maxn], f[maxn], g[maxn], h[maxn];
inline void Inc(int &x, const int y) {
x = x + y >= mod ? x + y - mod : x + y;
}
inline int Add(const int x, const int y) {
return x + y >= mod ? x + y - mod : x + y;
}
int main() {
int i, j, tmp1, tmp2;
scanf("%d%d", &n, &mod), f[0] = f[1] = c[0][0] = 1;
for (i = 2; i <= n; ++i) f[i] = (ll)f[i - 1] * i % mod;
for (i = 1; i <= n; ++i)
for (c[i][0] = j = 1; j <= i; ++j) c[i][j] = Add(c[i - 1][j - 1], c[i - 1][j]);
for (i = 2; i <= n; ++i) {
for (j = 1; j <= i; ++j) {
Inc(g[i], tmp1 = (ll)Add((ll)f[i - j] * (i - j) % mod, g[i - j]) * c[i - 1][j - 1] % mod * f[j - 1] % mod);
Inc(g[i], tmp2 = (ll)Add((ll)f[j - 1] * (j - 1) % mod, g[j - 1]) * c[i - 1][j - 1] % mod * f[i - j] % mod);
Inc(h[i], (ll)Add((ll)h[i - j] * f[j - 1] % mod, (ll)h[j - 1] * f[i - j] % mod) * c[i - 1][j - 1] % mod);
Inc(h[i], Add((ll)tmp1 * (j - 1) % mod, (ll)tmp2 * (i - j) % mod));
}
Inc(h[i], g[i]);
}
printf("%d\n", h[n]);
return 0;
}
BZOJ5305: [HAOI2018]苹果树的更多相关文章
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- BZOJ5305 [Haoi2018]苹果树 【组合数学】
题目链接 BZOJ5305 题解 妙啊 要求的是所有可能的树形的所有点对距离和 直接考虑点的贡献肯定想不出,这样的所有点对距离问题通常转化为边的贡献 考虑一条边会产生多少贡献 我们枚举\(i\)节点的 ...
- [BZOJ5305][HAOI2018]苹果树(DP)
首先注意到每种树都是等概率出现的,于是将问题转化成计数求和问题. f[n]表示所有n个点的树的两两点距离和的总和. g[n]表示所有n个点的树的所有点到根的距离和的总和. h[n]表示n个点的树的可能 ...
- [BZOJ5305][Haoi2018]苹果树 组合数
题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一 ...
- [BZOJ5305][HAOI2018]苹果树 组合数学
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- [HAOI2018]苹果树(组合数学,计数)
[HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...
随机推荐
- Linux Shell命令行快捷键
1. 命令行编辑 <Ctrl>+a 移动光标到行首 <Ctrl>+e ..........行尾 <Alt>+f 光标右移一个词 <Alt>+b .... ...
- spring mvc开发过程中的乱码问题
在保证jsp,xml,数据库,编辑器编码一致的情况下. 1,用户输入中文,后台接收到也是中文,但是保存到数据库时乱码, 解决方法: 链接数据库的url="jdbc:mysql://local ...
- Linux - route & traceroute & ip
route route - show / manipulate the IP routing table route 命令常用命令示例 #显示路由 route route -n # 不解析名字,快速显 ...
- 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化
一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ...
- flask中邮件发送方法
from flask import Flask from flask_mail import Mail, Message app = Flask(__name__) #配置邮件:服务器/端口/传输层安 ...
- HDFS概要
--HDFS-- Hadoop Distributed File System HDFS一个分布式,高容错,可线性扩展的文件系统 简介: Hadoop分布式文件系统(HDFS)是一种分布式文件系统,设 ...
- Spring Boot 中使用 Jedis 及 Lettuce的对比
首先,同样的程序,采用不同方式的Redis连接方式. defautl : 默认,0配置 ,也就是走的是 lettuce 单通道方式. 端口:8081 jedis : 使用Jedis 连接池. ...
- C#实现程序的版本升级更新
我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.那么看看我是如何实现程序自动更新的. 直接上代码: using System; using System.Collections.Ge ...
- Android从零开始
Android开发环境的安装 1 IDE Android可以使用开发的IDE有Eclipse 或者 Android Studio.Android Studio还处于v 0.1.x版本,是early a ...
- WPF 数据绑定 使用Code First with Database
一.准备工作 1.开发工具 Visual Studio 2013 2.安装 Entity Framework 6 Tools for Visual Studio 2012 & 2013 来实现 ...