传送门

果然只有我这种菜鸡才会用这种菜鸡做法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]苹果树的更多相关文章

  1. BZOJ5305 HAOI2018苹果树(概率期望+动态规划)

    每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...

  2. BZOJ5305 [Haoi2018]苹果树 【组合数学】

    题目链接 BZOJ5305 题解 妙啊 要求的是所有可能的树形的所有点对距离和 直接考虑点的贡献肯定想不出,这样的所有点对距离问题通常转化为边的贡献 考虑一条边会产生多少贡献 我们枚举\(i\)节点的 ...

  3. [BZOJ5305][HAOI2018]苹果树(DP)

    首先注意到每种树都是等概率出现的,于是将问题转化成计数求和问题. f[n]表示所有n个点的树的两两点距离和的总和. g[n]表示所有n个点的树的所有点到根的距离和的总和. h[n]表示n个点的树的可能 ...

  4. [BZOJ5305][Haoi2018]苹果树 组合数

    题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一 ...

  5. [BZOJ5305][HAOI2018]苹果树 组合数学

    链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...

  6. [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数

    Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...

  7. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. [洛谷P4492] [HAOI2018]苹果树

    洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...

  9. [HAOI2018]苹果树(组合数学,计数)

    [HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...

随机推荐

  1. Swift5 语言参考(六) 声明

    一个声明引入了一个新的名称或构建到你的程序.例如,您使用声明来引入函数和方法,引入变量和常量,以及定义枚举,结构,类和协议类型.您还可以使用声明来扩展现有命名类型的行为,并将符号导入到其他地方声明的程 ...

  2. mybatis 插件原理

    [传送门]:mybatis 插件原理

  3. java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)

    一.分模块项目打包失败 情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依 ...

  4. centos7 安装cmake

    安装cmake之前,记得升级gcc,请参考centos7 升级GCC版本到7.3.0 #shell 太简单,懒得解释 wget https://cmake.org/files/v3.11/cmake- ...

  5. postgresql-查看表大小

    drop table tablesize create table tablesize( phone int) create table tablesize( phone text) create t ...

  6. Intent的那些事儿

    请原谅我用这么文艺的标题来阐释一颗无时无刻奔腾着的2B青年的心.可是今天要介绍的Intent绝不2B,甚至在我看来,或许还有些许飘逸的味道,至于飘逸在哪里呢?那我们就好好来剖析剖析Intent和它的好 ...

  7. 前端组件化Polymer入门教程(1)——初识&&安装

    前端组件化Polymer入门教程目录: 前端组件化Polymer入门教程(1)--初识&&安装 前端组件化Polymer入门教程(2)--快速入门 前端组件化Polymer入门教程(3 ...

  8. maven - 使用nexus 搭建maven私服

    1, java环境 [wenbronk@localhost nexus]$ java -version java version "1.8.0_121" Java(TM) SE R ...

  9. shell脚本案例分享 - 业务系统日志自定义保留或删除需求

    需求说明:  线上某些业务系统的日志不定期产生, 有的每天产生, 有的好几天才产生, 因为系统只有在用的时候才产生日志,日志文件均存放在以当天日期命名的目录下. 当日志目录越来越多时就需要处理, 由此 ...

  10. maven jetty debug 无法关联第三方类库解决办法

    http://ifedorenko.github.com/m2e-extras/