[HAOI2018]苹果树(组合数学,计数)
[HAOI2018]苹果树
cx巨巨给我的大火题.
感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似.
考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到换一种思路,算每一条边有多少对点经过,很自然的想到状态\(dp[i][j]\)表示树标号到i,i子树的节点sz大小为j.这题是有标号的,先考虑无标号,那么i子树的形态一共有\(j!\)种.
i之上的树的形态(有先后顺序区别)有多少怎么算呢?已经到i了,说明前i个节点的形态已经确定,有\(i!\)种形态.
由于除了\((i-1)+j\)两部分以外,剩下的点有\(n-j-i+1\)个,这些点依次插入i的祖先们的子树中,第一次有\(i-1\),第二次有\(i\),然后\(i+1,i+2,...,i-2+(n-j-i+1)\)乘起来就是\(\frac{(n-j-1)!}{(i-2)!}\),分母可以和\(i!\)约掉.
考虑有标号,就是在\(n-i\)个点里选&j-1&个放在i子树里,其他的插在别的子树,那么就是乘以\(C_{n-i}^{j-1}\)
再就是贡献还要乘上\(j(n-j)\)
所以
f[i][j]=\frac{(n-j-1)!}{(i-2)!}*i!*j*(n-j)*C_{n-i}^{j-1}*j!\\
=(n-j)!*i*(i-1)*C_{n-i}^{j-1}*j!
\end{align}
\]
这题注意p不是质数,不可以求逆元算.
#include<bits/stdc++.h>
#define maxn 3005
#define ll long long
using namespace std;
int inv[maxn],fac[maxn],dp[maxn][maxn];
int mod,n,ans,c[maxn][maxn];
//int C(int n,int m){return (ll)fac[n]*fac[m]%mod*fac[n-m]%mod;}
int main()
{
cin>>n>>mod;fac[0]=inv[1]=inv[0]=1;
for(int i=1;i<=n;i++)fac[i]=(ll)fac[i-1]*i%mod;
//for(int i=2;i<=n;i++)inv[i]=(mod-(ll)(mod/i)*inv[mod%i]%mod)%mod;
//for(int i=2;i<=n;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
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])%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=(ll)fac[j]*fac[n-j]%mod*i%mod*(i-1)%mod*j%mod*c[n-i][j-1]%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)ans+=dp[i][j],ans%=mod;
cout<<ans<<endl;
return 0;
}
[HAOI2018]苹果树(组合数学,计数)的更多相关文章
- [BZOJ5305][HAOI2018]苹果树 组合数学
链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...
- BZOJ.5305.[HAOI2018]苹果树(组合 计数)
LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...
- luoguP4492 [HAOI2018]苹果树 组合计数 + dp
首先,每个二叉树对应着唯一的中序遍历,并且每个二叉树的概率是相同的 这十分的有用 考虑\(dp\)求解 令\(f_i\)表示\(i\)个节点的子树,根的深度为\(1\)时,所有点的期望深度之和(乘\( ...
- BZOJ 5305: [Haoi2018]苹果树 组合计数
一定要注意要乘阶乘,细节很多. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s ...
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
- BZOJ5305 [Haoi2018]苹果树 【组合数学】
题目链接 BZOJ5305 题解 妙啊 要求的是所有可能的树形的所有点对距离和 直接考虑点的贡献肯定想不出,这样的所有点对距离问题通常转化为边的贡献 考虑一条边会产生多少贡献 我们枚举\(i\)节点的 ...
- [HAOI2018]苹果树(组合数学)
首先有个很奇妙而且很有用的性质:每个二叉树对应唯一的中序遍历,然后每个二叉树出现概率相同.所以n个节点的二叉树形态是n!种(题目中说了*n!已经是提示了),对每种方案求和即可得到期望.令f[i]表示i ...
随机推荐
- 查看内存的方法。vs-调试-窗口-内存
1.vs-调试-窗口-内存 2.把指针复制到内存窗口中,就可以查看窗口的内存了.
- 个人永久性免费-Excel催化剂功能第62波-单元格区域内数据加解密处理,最有效地保护数据方式
Excel的数据保护能力有限,诸如之前提及过的工作表保护.工作薄保护等,都是十分微弱的保护措施,而对于强保护的工作薄打开密码来说,它像是个总开关一样,要么全不能看,要么就全看到.有这样的场景需求,一份 ...
- java优化之 单例模式的优化
该分类下的文章均为笔者阅读<Java程序性能优化>(葛一鸣)一书之所理解.如有欠缺,还请大佬们指点.
- [leetcode]914. X of a Kind in a Deck of Cards (easy)
原题 题目原意可转换为 两组有大于等于2的公因数 /** * @param {number[]} deck * @return {boolean} */ var hasGroupsSizeX = fu ...
- 《VR入门系列教程》之19---GearVR开发初识
本章我们来介绍一下如何在移动VR设备的佼佼者GearVR上进行开发,之前我们在桌面端的VR开发想法可以直接应用在移动端,但是仍然会有些不一样的技术需要注意.这次,我们仍然采用Unity3D引擎构建示例 ...
- python 文件读写总结
这是个人在项目中抽取的代码,自己写的utils的通用模块,使用的框架是tronado,包括了文件的读写操作,api格式的统一函数,如有特别需要可以联系我或者自己扩展,刚学python不久,仅供参考,例 ...
- 【杂谈】如何对Redis进行原子操作
什么时候需要进行需要原子操作? 很常见的例子,就是利用Redis实现分布式锁. 实现锁需要哪些条件? 我们知道要实现锁,就需要一个改变锁状态的方法.这个方法能原子地对锁的状态进行检查并修改.如果修改成 ...
- .Net Core2.2 WebApi上传文件
基于.net core2.2的webapi程序,接收客户端上传的文件.按照以下写法,file的值永远是null [HttpPost] public void Post([FromForm] IForm ...
- [学习笔记] pymysql入门
一.快速开始 对于会用MySQL的朋友来说,开始使用pymysql可以说真的so esay,只要用下面的代码,把想要对数据库的操作放在 sql = " " 里就可以了. 没有接触过 ...
- PHP与ECMAScript_3_常用字符串函数
PHP ECMAScript 长度 strlen($str) str.length 查找类 $str[n] ...