首先有个很奇妙而且很有用的性质:每个二叉树对应唯一的中序遍历,然后每个二叉树出现概率相同。所以n个节点的二叉树形态是n!种(题目中说了*n!已经是提示了),对每种方案求和即可得到期望。令f[i]表示i个节点的子树,根深度为1时,所有点的期望深度之和乘i!的值,令g[i]表示i个节点的子树,期望两两路径之和乘i!的值。

然后得到f[i]=i*i!+ΣC(i-1,L)(f[L]*R!+f[R]*L!),g[i]=ΣC(i-1,L)(g[L]*R!+g[R]*L!+f[L]*R!*(R+1)+f[R]*L!*(L+1)),其中0<=L<i,L、R为左/右子树大小,只需要枚举L即可(因为R=i-1-L),复杂度O(n2)

这题这么水的吗qwq?其实当模数做NTT时,貌似可以分治NTT优化O(nlog2n),反正我不会就不管了。

#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,mod,c[N][N],fac[N],f[N],g[N];
int main()
{
scanf("%d%d",&n,&mod);
fac[]=c[][]=;
for(int i=;i<=n;i++)
{
c[i][]=,fac[i]=1ll*fac[i-]*i%mod;
for(int j=;j<=i;j++)c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
f[]=;
for(int i=;i<=n;i++)
{
for(int L=;L<i;L++)
{
int R=i--L,F,G;
F=(1ll*f[L]*fac[R]+1ll*f[R]*fac[L])%mod;
G=(1ll*f[L]*fac[R]%mod*(R+)+1ll*f[R]*fac[L]%mod*(L+)+1ll*g[L]*fac[R]+1ll*g[R]*fac[L])%mod;
f[i]=(f[i]+1ll*F*c[i-][L])%mod;
g[i]=(g[i]+1ll*G*c[i-][L])%mod;
}
f[i]=(f[i]+1ll*i*fac[i])%mod;
}
printf("%d",g[n]);
}

最新文章

  1. TinyMCE 官方插件一览表(不完全)
  2. BLE教程 - 官方tutorial翻译
  3. SQL SA密码丢失
  4. VS2010 添加服务引用以后点不出引用服务的命名空间
  5. 【poj1006】 Biorhythms
  6. wikioi 3038 3n+1问题
  7. C++中C/C++格式化输出
  8. MacOS显示和不显示隐藏文件
  9. Linux sed命令常用方法
  10. BZOJ 1977 次小生成树(最近公共祖先)
  11. MySql优化-你的SQL命中索引了吗
  12. webpack和webpack-dev-server的区别
  13. openstack私有云布署实践【16.3 Windows Server2008 R2 只有C盘分区镜像制作】
  14. Struts2文件的上传
  15. C# 实现邮件发送
  16. 算法 set / multiset -- lower_bound()的二分搜索
  17. C# 对轻量级(IoC Container)依赖注入Unity的使用
  18. 【20180111】【物流FM专访】贝业新兄弟李济宏:我们是如何做到大件家居B2C物流第一的?
  19. AX_InventCounting
  20. java生成TXT

热门文章

  1. Spring 事件(1)- 内置事件
  2. CGridCtrl添加右键菜单
  3. Day2-T2
  4. IntelliJ IDEA ULTIMATE 2019.3 破解注册详细教程【亲测有效,持续更新~】
  5. GitHub Token for composer
  6. 201809-1 卖菜 Java
  7. 一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数
  8. git push的时候.gitignore不起作用的解决方法
  9. 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)
  10. .NET技术-4.0. NETCORE跨域