Summary

题意很清楚:

小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支.

经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点.

第一天的时候, 果树会长出一个根结点, 以后每一天, 果树会随机选择一个当前树中没有长出过结点的分支, 然后在这个分支上长出一个新结点, 新结点与分支所属的结点之间连接上一条边.

小 \(C\) 定义一棵果树的不便度为树上两两结点之间的距离之和, 两个结点之间 的距离定义为从一个点走到另一个点的路径经过的边数.

现在他非常好奇, 如果 \(N\) 天之后小 \(G\) 来他家摘苹果, 这个不便度的期望 \(E\) 是多少. 但是小 \(C\) 讨厌分数, 所以他只想知道 \(E \times N!\) 对 \(P\) 取模的结果, 可以证明这是一个整数.

Solution

一开始想用树形DP,但是发现子树间不是独立的,所以用不了。

首先可以发现,每次加上一个点以后,其父节点少了一个空位,但是他自己有提供了两个空位。

因此每增加一个节点,都会多一个空位。添加第$i$个点的时候,就有$i$个空位。

所以总方案数为$N!$。因此,$E\times N!$就是所有形态的树的的不便度总和。

根据这种题目的套路,应该考虑每条边的贡献。但是发现所有的边都是不确定的。

但是好好想想,其实只要一个点的子树大小确定了,其连向父节点的边的贡献也就定下来了。每一个子树内的点和子树外的点的搭配,都会经过这条边。因此,假设子树大小为$j$,那么那个点连向其父节点的边的贡献就是$j\cdot(n-j)$。

然后考虑每一个子树的根节点,设其为$i$。因为加点是有顺序的,我们不妨假设编号为$i$的点是第$i$个加入的。

那么这$i$个点的形态就有$i!$种。然后子树内,也有$j!$种形态。

但是子树内有哪些点呢?

首先这些点的组合肯定是$C_^$种。因为加点顺序是定下来的,所以不需要考虑加点顺序带来的不同的树。

然后只剩下了子树外的。

子树外呢,前$i-1$个点加完以后,有$i$个空位。有一个空位被$i$占掉了,那么还剩下$i-1$个空位。

因为除了$i$这棵子树,以及已经加过的点,还剩下$n-i-j+1$个点。

每次加一个点,多一个空位。所以每一多一个空位,直到加完,那么最后一次加点前的空位数为$i-1+n-i-j+1-1=n-j-1$,注意最后一次$-1$是因为最后一次还没有加点。

所以那些点的形态有$\prod \limits_^ k$个。

那么总共,第$i$个点的子树大小为$j$的贡献就是

\[
j\cdot(n-j)\cdot j! i!\cdot C_{n-i}^{j-1}\cdot \prod_{k=i-1}^{n-j-1}k
\]

这个东西再化一化,后面的连乘和前面的$i!,\ (n-j)$可以合并到一起,然候再拎出中间重复的。

\[
ij(i-1)\cdot j!\cdot (n-j)!\cdot C_{n-i}^{j-1}
\]

然候就可以$O(n^2)$ 枚举$i,\ j$,计算出来了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define REP(i,a,n) for(register int i=a;i<=n;++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
typedef long long ll;
const int N=2000+7;
int n,P,C[N][N],fac[N],ans;
inline void SADD(int&x,const int&y){x+=y;x>=P?x-=P:0;}//´íÎó±Ê¼Ç£º-=µÈºÅÍü´òÁË
inline int SMOD(int x){return x>=P?x-P:x;}
inline void Preprocess(){
C[0][0]=fac[0]=1;
REP(i,1,n){
C[i][0]=1;fac[i]=(ll)fac[i-1]*i%P;
REP(j,1,i)C[i][j]=SMOD(C[i-1][j-1]+C[i-1][j]);
}
}
int main(){
scanf("%d%d",&n,&P);
Preprocess();
REP(i,2,n)REP(j,1,n-i+1)SADD(ans,(ll)j*i*(i-1)%P*fac[j]%P*fac[n-j]%P*C[n-i][j-1]%P);
printf("%d\n",ans);
}

[BZOJ5305] [HAOI2018] 苹果树 数学 组合计数的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ5305: [HAOI2018]苹果树

    传送门 果然只有我这种菜鸡才会用这种菜鸡做法QwQ 对于一类要求期望的题目,有一个无脑的做法: 设概率为 \(f\),期望为 \(g\) 每次合并两个二元组 \(<f_1,g_1>,< ...

  8. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

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

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

随机推荐

  1. php array_chunk()函数 语法

    php array_chunk()函数 语法 作用:把数组分割为新的数组块.dd马达参数 语法:array_chunk(array,size,preserve_key) 参数: 参数 描述 array ...

  2. php中换行怎么写

    PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 unix系列用(推荐学习:PHP编程从入门到精通) 1 windows系列用 1 \r\n mac用 1 如: 1 2 3 4 5 6 ...

  3. Webstorm软件快捷键

    默认配置-Eclipse的常用快捷键对照表 查找/代替 Webstorm快捷键 Eclipse快捷键 说明 ctrl+shift+N ctrl+shift+R 通过文件名快速查找工程内的文件(必记) ...

  4. iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案

    今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家. 在iOS7之前的系统,如果要自定义返回按钮,直接设置b ...

  5. php面试专题---20、MySQL的安全性考点

    php面试专题---20.MySQL的安全性考点 一.总结 一句话总结: 还是得多看视频,教程看的浮光掠影,容易get不到重点:比如预处理防sql注入之前是挺熟,后面就忘记了,而且看文章get不到点 ...

  6. 42 Bing Search Engine Hacks

    42 Bing Search Engine Hacks November 13, 2010 By Ivan Remember Bing, the search engine Microsoft lau ...

  7. 清北学堂Day 6之STL

    电脑突然一炸,什么都没有保存,凉了.(又出现了笔记凉凉事件嘤嘤嘤) 行吧慢慢回忆 就算我们会手写,我们也要学STL.吸了O2的STL可是要上天的. 数据结构 pair 使用方式: pair<类型 ...

  8. 利用 Skywalking 搭建 APM(应用性能管理)— 安装与配置

    1.什么是 Skywalking Skywalking 是一个APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过这些调用链路以及指标 ...

  9. H3C CAS 介绍 & 基本概念

    目录 目录 基本概念 H3C CAS 中的虚拟机 虚拟机中的虚拟设备 虚拟 CPU 的 3 种工作模式 虚拟网卡的 3 种类型 虚拟磁盘的三种类型 虚拟机辅助工具 CAS Tools 虚拟机外的虚拟设 ...

  10. 【MM系列】SAP KP26 报工出错

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP KP26 报工出错   前言 ...