洛谷题目传送门

题目描述

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

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

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

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

题意简介

给定n,定义一个二叉树的权值为树上所有点对的最短距离和,求大小为n 的所有带标号二叉树的权值和。

解题思路

首先考虑n个点的无标号二叉树的构造方案数(左右儿子不同)
当n=1时,方案数为1

当n=2时,方案数为2(空心表示可选节点)

当n=3时,方案数为 2 × 3 = 6 2\times3=6 2×3=6

因此,一颗n各节点的树构造方案数是 n ! n! n!
然后开始计算答案,设当前第i个节点,该节点子树大小为j(包含i节点)
则i与i的父亲的连边对答案的贡献为 j × ( n − j ) j\times(n-j) j×(n−j),也就是每一条经过这条边的路径都会产生贡献
构造之前i各节点的方案数为i!,构造子树的方案数为j!,但是因为有标号,所以子树的标号要从(n-i)里选 j-1 个(不算 i 节点),也就是 C n − i j − 1 C_{n-i}^{j-1} Cn−ij−1​
最后一部分是生成i+j-1后面的节点,并且这些节点不能放在i的子树中,所以这些节点中的第一个的方案数为 i-1,第2个为 i ,最后一个 是(n-j-1),总体方案数是
也就是 ( n − j − 1 ) ! ( i − 2 ) ! \frac{(n-j-1)!}{(i-2)!} (i−2)!(n−j−1)!​
把答案乘起来,也就是
∑ i = 1 n ∑ j = 1 n − j + 1 j ( n − j ) j ! C n − i j − 1 i ! ( n − j − 1 ) ! ( i − 2 ) ! \sum_{i=1}^{n}\sum_{j=1}^{n-j+1}j(n-j)j!C_{n-i}^{j-1}i!\frac{(n-j-1)!}{(i-2)!} i=1∑n​j=1∑n−j+1​j(n−j)j!Cn−ij−1​i!(i−2)!(n−j−1)!​
但是题目没保证模数p为质数,因此逆元可能没有,所以我们继续化简得
∑ i = 1 n ∑ j = 1 n − j + 1 j ( n − j ) j ! C n − i j − 1 ( n − j − 1 ) ! i ( i − 1 ) \sum_{i=1}^{n}\sum_{j=1}^{n-j+1}j(n-j)j!C_{n-i}^{j-1}{(n-j-1)!}i(i-1) i=1∑n​j=1∑n−j+1​j(n−j)j!Cn−ij−1​(n−j−1)!i(i−1)
算组合数也不能用逆元, n 2 n^2 n2递推计算就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2010;
LL n,p,ans;
LL C[N][N],fact[N];
void prework()
{fact[0]=1;for(int i=1;i<=n;i++)fact[i]=fact[i-1]*i%p;for(int i=0;i<=n;i++)C[i][0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){C[i][j]=(C[i-1][j-1]+C[i-1][j])%p;}}
}
int main()
{scanf("%d%d",&n,&p);prework();for(int i=1;i<=n;i++){for(int j=1;j<=n-i+1;j++){ans=(ans+j*(n-j)%p*fact[j]%p*C[n-i][j-1]%p*fact[n-j-1]%p*i%p*(i-1)%p)%p;}}cout<<ans;return 0;
}

[HAOI2018]苹果树(组合数学)相关推荐

  1. [HAOI2018]苹果树 组合数学

    [HAOI2018] 基础组合数学 Code #include<bits/stdc++.h> #define rep(i,a,b) for(ll i=(a);i<=(b);i++) ...

  2. P4492 [HAOI2018]苹果树(组合数学+递推)

    LINK 一颗苹果树长 n n n天,第一天长出根节点,每个节点有左右两个分支 以后每一天,在这棵树的所有分支处随机选择一个,长出一个新节点 定义这个树的不便度为树上两两节点的距离和 E E E,输出 ...

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

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

  4. bzoj5305 [Haoi2018]苹果树(组合数学)

    首先n个点的这样生成的二叉树有n!种. 因此这就不再是一个期望问题,而是计数问题! 可能没逆元,烦躁qaq 考虑给每个点按生成顺序标号,我们来计算i->fa[i]这条边对答案的贡献. 我们枚举i ...

  5. 【组合数学-DP】BZOJ5305 [HAOI2018] 苹果树

    [题目] lydsy 一棵果树每个节点恰好有两个分支,初始只有一个根节点,每天果树会随机选择一个当前没有长出过节点的分支长出节点.求 n n n天后期望树点对之间距离和 E E E,输出 E × n ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. mysql数据库字段类型大全_mysql数据库字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  8. c语言oj答案进制转换,C语言编程的进制问题问题

    在我们的编译器,我用的是ADS   开发平台,现在RTC模块编程时,2410作为上位机,如下代码: n = rBCDDATE; if(n==1) time->day =0x31 ; 波斯历的日期 ...

  9. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

最新文章

  1. spring 依赖注入
  2. win7计算机内存占用高,WIN7系统电脑内存占用高的解决办法有哪些
  3. 研诺首款D类音频放大器延长便携应用中的电池寿命
  4. Linux必懂知识大总结(上)
  5. nodejs入门学习笔记一——一个完整的http路由服务实现
  6. 深圳先进院研究生计算机专业,2020年中科院深圳先进技术研究院全日制硕士研究生统考专业说明...
  7. WPF RichTextBox设置文本颜色
  8. WP7模拟器使用技巧
  9. 人工神经网络MATLAB例子,matlab人工神经网络模型
  10. colab配合谷歌云盘使用
  11. 药店零售管理php系统,医药POS零售管理系统
  12. 死磕 Framework准没错,大把的高薪岗位等着你~
  13. 高斯消元法求逆矩阵 matlab,matlab中求逆矩阵的高斯消元法实现的代码
  14. 从零部署Linux服务器完全指南2022版(CentOS 8+Nginx+PHP)
  15. DSAPI多功能.NET函数库组件
  16. Cisco SN查询工具
  17. bilibili level up
  18. 哈夫曼树的构造及C++代码实现
  19. oracle存储过程新手学习
  20. 位运算——强大得令人害怕

热门文章

  1. linux 中prefetch文件夹,Prefetch是什么 Prefetch文件夹功能介绍
  2. 材料员报考建筑八大员报考建筑材料钢筋和混凝土的特性介绍
  3. 【读书笔记】《蛤蟆先生去看心理医生》- [英] 罗伯特·戴博德 - 1997年出版
  4. css 字间距离_css 字体字符间距设置
  5. 活动星投票优秀支书网络评选微信的投票方式线上免费投票
  6. 开源工具分享--PicoShare文件共享系统【网盘替代方案】
  7. MySQL获取当前时间
  8. 基于HTTP的Nginx代理配置和代理缓存
  9. 移动广告作弊流量的浅潜规则
  10. FGD针对目标检测的重点与全局知识蒸馏