首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的

这十分的有用

考虑\(dp\)求解

令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\(i!\))的值

令\(g_i\)表示\(i\)个节点的子树,期望两两路径之和(乘\(i!\))的值

那么\(f_i = i * i! + \sum \limits_{L = 0}^{i - 1} \binom{i - 1}{L} (f_L * R! + f_R * L!)\),\(L, R\)分别表示左右子树的值

\(g_i = \sum \limits_{L = 0}^{i - 1} \binom{i - 1}{L} (g_L * R! + g_R * L! + f_L * R! * (R + 1) + f_R * L! * (L + 1))\)

复杂度\(O(n^2)\)

由于没有逆元,因此组合数要预处理


好像可以用多项式优化到\(O(n \log^2 n)\)QAQ


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --) const int sid = 2e3 + 5; int n, mod;
int C[sid][sid], fac[sid], f[sid], g[sid]; inline void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; }
inline void dec(int &a, int b) { a -= b; if(a < 0) a += mod; }
inline int Inc(int a, int b) { return (a + b >= mod) ? a + b - mod : a + b; }
inline int Dec(int a, int b) { return (a - b < 0) ? a - b + mod : a - b; }
inline int mul(int a, int b) { return 1ll * a * b % mod; } inline void init() {
fac[0] = C[0][0] = 1;
rep(i, 1, n) {
C[i][0] = C[i][i] = 1;
fac[i] = mul(fac[i - 1], i);
rep(j, 1, i - 1) C[i][j] = Inc(C[i - 1][j], C[i - 1][j - 1]);
}
} inline void dp() {
f[1] = 1;
rep(i, 2, n) {
rep(L, 0, i - 1) {
int R = i - 1 - L, F = 0, G = 0;
F = (1ll * f[L] * fac[R] + 1ll * f[R] * fac[L]) % mod;
G = (1ll * f[L] * fac[R] % mod * (R + 1) % mod);
inc(G, 1ll * f[R] * fac[L] % mod * (L + 1) % mod);
inc(G, 1ll * g[L] * fac[R] % mod);
inc(G, 1ll * g[R] * fac[L] % mod);
inc(f[i], mul(F, C[i - 1][L])); inc(g[i], mul(G, C[i - 1][L]));
}
inc(f[i], 1ll * i * fac[i] % mod);
}
printf("%d\n", g[n]);
} int main() {
cin >> n >> mod;
init(); dp();
return 0;
}

最新文章

  1. Web API Filter ActionFilterAttribute 使用
  2. hbase 使用
  3. 《ASP.NET MVC4 WEB编程》学习笔记------ViewBag、ViewData和TempData的使用和区别
  4. Struts2的工作流程
  5. Java 并发——多线程基础
  6. HDU3714 Error Curves (单峰函数)
  7. linux 编程技术No.1前期准备工作
  8. 移动平台下的Socket几个问题
  9. Selenium发展史
  10. 监听RecyclerView滑动到末端
  11. PHP——秒数转换为时分秒
  12. CF1153D Serval and Rooted Tree
  13. win10系统中如何解决cmd中的路径和现在电脑的用户名不一致
  14. HttpResonse 要记得关闭
  15. 剑指offer(13)调整数组顺序使奇数位于偶数前面
  16. blfs(systemv版本)学习笔记-制作一个简单的桌面系统
  17. MYSQL常用函数(格式化函数)
  18. win8.1的ie11无法打开127.0.0.1和本机IP访问
  19. 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)
  20. **python中的类和他的成员

热门文章

  1. 存储过程简单Demo
  2. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
  3. ubuntu16.04 eclipse+pydev 配置
  4. 在Mac上搭建ReactNative开发环境
  5. 使用免安装压缩包安装MySQL
  6. angular可自定义的对话框,弹窗指令
  7. Unix IPC之互斥锁与条件变量
  8. TIAGo ROS模拟教程2 - 自主机器人导航
  9. Tango ROS Streamer
  10. CentOS7的firewall和安装iptables