P4492 [HAOI2018]苹果树
思路
题目要求的其实就是每种方案的权值之和(因为每种方案的概率相等)
所以自然想到要求所有的边对最终答案的贡献次数
考虑这一条边被经过了多少次,有这个子树内的点数*子树外的点数次,即\(k\times(n-k)\)
然后考虑总共的中序遍历总共有\(n!\)种,每种方案等概率
先钦定一个点\(i\)(乘上\(i!\)),然后枚举它的\(sz\),这样相当于枚举了每种生成的树的形态,做到了不重不漏
对于这个点\(i\),考虑选择K个点作为它的子树进行统计(\(sz_i=K+1\)),然后选择的k个点的方案数是\(\left(\begin{matrix}n-i\\K\end{matrix}\right)\),这\(K\)个点能构成的树的形态总数有\(K!\)个,然后考虑剩下的\(n-k-i\)个点的分配方案,因为不能放在\(i\)的子树中,所以分配的方案有\((i-1)(i)\dots(n-K-2)\)种(\(n-K-2\)因为只剩一个点,能选择\(n-sz_i-1=n-K-2\)个点),化简一下等于\(\frac{(n-k-2)!}{(i-2)!}\)
然后式子就出来了(注意i从二开始,因为从1开始似乎没有什么意义)
\]
然后就很可做了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
int n,p,C[2010][2010],jc[2010],ans=0;
signed main(){
scanf("%d %d",&n,&p);
jc[0]=1;
for(int i=1;i<=n;i++)
jc[i]=(jc[i-1]*i)%p;
C[0][0]=1;
for(int i=1;i<=n;i++)
C[i][0]=C[i][i]=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;
for(int i=2;i<=n;i++)
for(int j=1;j<=n-i+1;j++)
ans=(ans+jc[j]*C[n-i][j-1]%p*jc[n-j-1]%p*(i-1)%p*i%p*j%p*(n-j)%p+p)%p;
printf("%d\n",ans);
return 0;
}
P4492 [HAOI2018]苹果树的更多相关文章
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- 洛谷P4492 [HAOI2018]苹果树(组合数)
题意 题目链接 Sol 有点自闭,.我好像对组合数一窍不通(~~~~) Orz shadowice // luogu-judger-enable-o2 #include<bits/stdc++. ...
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- [HAOI2018]苹果树(组合数学,计数)
[HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...
- 题解 洛谷 P4492 【[HAOI2018]苹果树】
考虑生成一颗二叉树的过程,加入第一个节点方案数为\(1\),加入第二个节点方案数为\(2\),加入第三个节点方案数为\(3\),发现生成一颗\(n\)个节点的二叉树的方案数为\(n!\). 所以题目中 ...
- Luogu 4492 [HAOI2018]苹果树 组合数
https://www.luogu.org/problemnew/show/P4492 找每个编号的点的父边的贡献,组合数和阶乘就能算了. 我考场上怎么就是没想到呢. 调了好久好久好久好久调不出来,样 ...
- [BZOJ5305][Haoi2018]苹果树 组合数
题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一 ...
- [BZOJ5305][HAOI2018]苹果树 组合数学
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
随机推荐
- html5-垂直定位
*{ padding: 0px; margin: 0px; }#div2{ background: green; padding: 15px; width: 200px; ...
- form的action属性值对应servlet的web.xml的url-pattern
<form action="abc">在web.xml里面<servlet><servlet-name>123</servlet-name ...
- vim 命令学习(基础篇)
[1]三种模式 vi的三种模式:命令模式.末行模式.编辑模式. 三种模式相互切换逻辑与命令图: 1.命令模式是vi的默认模式(即每打开一个文件时的初始模式). 2.命令模式切换至末行模式,末行模式切换 ...
- ★★★kalinux 常用命令
1.修改密码: sudo passwd root 2.重启:reboot ====================================== arch 显示机器的处理器架构(1) una ...
- android手机平板如何使用usb有线网卡
最近有个项目需要在android平板上使用usb有线网卡,所以做了一部分工作,在这里简单总结一下. 我在TB上购买了一个micro-usb接口的android免驱有线网卡,这个网上很多,随便买一个符合 ...
- Eclipse创建maven工程后没有build path解决方案
1.修改maven工程下的.project文件为如下内容 <?xml version="1.0" encoding="UTF-8"?> <pr ...
- 转:Process类的使用
转载自:http://www.oschina.net/code/snippet_119226_6188 一.根据进程名获取进程的用户名? 需要添加对 System.Management.dll 的引用 ...
- freemark、jsp&css
**************************************************************freemark相关**************************** ...
- 基于jquery、bootstrap的数据验证插件bootstrapValidator使用
实时验证用户名是否存在,密码不能和用户名相同,两次密码需要相同,提交之后需要验证返回值: <form id="defaultForm" role="form&quo ...
- Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示
一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...