ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CF1528F]AmShZ Farm

2021-06-11 23:00:26  阅读:231  来源: 互联网

标签:CF1528F 二元 Farm sum cdot choose AmShZ 排序 节点


题目

传送门 to CF

思路

显然 m o r e − e q u a l \rm more-equal more−equal 就是,不超过 i i i 的数字至少有 i i i 个。

求 b b b 之前,我们先把 a a a 摸清楚。比如说 a a a 序列究竟有多少个呢?

上面那个限制,其实可以转换一下。想想我们怎么求不超过 i i i 的数字?排序之后二分查找嘛。所以我们这里的限制其实就是 a a a 数组排序后第 i i i 个数字不大于 i i i

如果记 ⟨ a i ′ ⟩ \langle a'_i\rangle ⟨ai′​⟩ 为排序后的 a a a 数组,那么 1 ≤ a i ′ ≤ i 1\le a'_i\le i 1≤ai′​≤i 。这像不像很多题目中的 一棵树 的输入方式?即 a i ′ − 1 ∈ [ 0 , i ) a'_i-1\in[0,i) ai′​−1∈[0,i) 作为父节点。显然 0 0 0 是根节点,因为不存在 a 0 ′ a'_0 a0′​ 。

我们将二元组 ⟨ a i , i ⟩ \langle a_i,i\rangle ⟨ai​,i⟩ 拿出来从小到大排序,设 x i x_i xi​ 是第 i i i 小的二元组的下标,即 ⟨ a x i , x i ⟩ \langle a_{x_i},x_i\rangle ⟨axi​​,xi​⟩ 是第 i i i 小的二元组。然后我们可以构建一棵树,点 p p p 的父节点是 x a p − 1 x_{a_p-1} xap​−1​,即排序后的第 a p − 1 a_p-1 ap​−1 个 “下标”,规定第 0 0 0 个是 0 0 0 。

显然它构成一棵树,因为 a x i a_{x_i} axi​​ 就是第 i i i 小的 a a a,第二关键字只是用来保持其稳定性。所以 x i x_i xi​ 会将 x j    ( j < i ) x_j\;(j<i) xj​(j<i) 作为其父节点。

我们很想直接做树计数,所以我们要证明 二者是一一对应的。而排序后的二元组不同,原来的 a a a 序列就不同,因为我们引入了下标作为第二关键字,所以我们只需要知道,给出一棵树,能否唯一确定这些二元组呢?

事实确实如此。也很简单:最小的二元组肯定是 a = 1 a=1 a=1,即根节点 0 0 0 的儿子,记其为 G 0 G_0 G0​ 。它们的顺序是按照编号确定了的。于是我们就得到了前几个二元组。然后次小的就是 a = 2 a=2 a=2,即刚才确定的最小二元组 x 0 ∈ G 0 x_0\in G_0 x0​∈G0​ 的子节点。它们又是按照编号排序。再次小就是 a = 3 a=3 a=3,即 x 1 ∈ G 0 x_1\in G_0 x1​∈G0​,它的子节点按照编号排序……

代码会不会更容易理解?设 c n t [ i ] cnt[i] cnt[i] 初值是深度小于 i i i 的点的数量,设 G [ i ] G[i] G[i] 是 i i i 的所有子节点,那么我们可以还原出 x x x 序列。这里 x 0 x_0 x0​ 将会被赋值为根节点 0 0 0 。

void getX(int now,int dep){
	x[cnt[dep] ++] = now;
	sort(G[now].begin(),G[now].end());
	for(auto y : G[now]) getX(y,dep+1);
}

即,子节点按照编号排序,然后一层一层的放到 x x x 序列里去。显然这是唯一的方案。

所以我们已经可以下结论了。 a a a 序列与一个 n + 1 n+1 n+1 个点的有标号树是对应的。根据 p r u f e r \rm prufer prufer 序列可知 a a a 序列的数量就是 ( n + 1 ) n − 1 (n+1)^{n-1} (n+1)n−1 。

然后来考虑 b b b 。无非就是 a i = v a_i=v ai​=v 的个数为 x x x 时,有 x k x^k xk 的贡献。那么在树中,当 v ≠ 0 v\ne 0 v​=0 时, v v v 有 x x x 个儿子、一个父亲,所以在 p r u f e r \rm prufer prufer 序列中出现 x x x 次;当 v = 0 v=0 v=0 时,则只出现 x − 1 x-1 x−1 次。二者相加即
n ⋅ ( n − 1 x ) n n − 1 − x + ( n − 1 x − 1 ) n n − x = ( n x ) ⋅ n n − x n\cdot{n-1\choose x}n^{n-1-x}+{n-1\choose x-1}n^{n-x}\\ ={n\choose x}\cdot n^{n-x} n⋅(xn−1​)nn−1−x+(x−1n−1​)nn−x=(xn​)⋅nn−x

所以答案就是
∑ x = 1 n ( n x ) ⋅ n n − x ⋅ x k \sum_{x=1}^{n}{n\choose x}\cdot n^{n-x}\cdot x^k x=1∑n​(xn​)⋅nn−x⋅xk

我很认真很认真地思考了一下,为什么这里要把 x k x^k xk 写成 下降幂 呢?但是我始终无法解释。或许真的只能背下来吗?还是说有一种惊人的直觉,仅仅属于拉马努金那样的人,在梦中以神示展现了一切?

众所周知 n m n^m nm 可以利用第二类斯特林数写成下降幂,即
n m = ∑ i = 0 min ⁡ ( m , n ) ( n i ) ⋅ S ( m , i ) ⋅ i ! n^m=\sum_{i=0}^{\min(m,n)}{n\choose i}\cdot S(m,i)\cdot i! nm=i=0∑min(m,n)​(in​)⋅S(m,i)⋅i!

其中 S ( m , i ) S(m,i) S(m,i) 为,把 m m m 个有标号的球放进 i i i 个无标号的盒子,不能空盒,本质不同方案数。组合意义上这个等式是显然的,都代表 m m m 个有标号的球放入 n n n 个有标号的盒子的方案数。利用这个很轻易能得到
a n s = ∑ x = 1 n ( n x ) ⋅ n n − x ∑ i = 0 k ( x i ) ⋅ S ( k , i ) ⋅ i ! = n n ∑ i = 0 k S ( k , i ) ⋅ i ! ⋅ ( n i ) ∑ x = i n ( n − i x − i ) n − x = n n ∑ i = 0 k S ( k , i ) ⋅ i ! ⋅ ( n i ) ⋅ n − i ⋅ ( 1 + n − 1 ) n − i ans=\sum_{x=1}^{n}{n\choose x}\cdot n^{n-x}\sum_{i=0}^{k}{x\choose i}\cdot S(k,i)\cdot i!\\ =n^n\sum_{i=0}^{k}S(k,i)\cdot i!\cdot{n\choose i}\sum_{x=i}^{n}{n-i\choose x-i}n^{-x}\\ =n^n\sum_{i=0}^{k}S(k,i)\cdot i!\cdot {n\choose i}\cdot n^{-i}\cdot (1+n^{-1})^{n-i} ans=x=1∑n​(xn​)⋅nn−xi=0∑k​(ix​)⋅S(k,i)⋅i!=nni=0∑k​S(k,i)⋅i!⋅(in​)x=i∑n​(x−in−i​)n−x=nni=0∑k​S(k,i)⋅i!⋅(in​)⋅n−i⋅(1+n−1)n−i

然后 S ( k , i ) S(k,i) S(k,i) 怎么求呢?它有一个 容斥 的求法,枚举空盒数量,有
S ( k , i ) = 1 i ! ∑ j = 0 i ( − 1 ) j ⋅ ( i j ) ⋅ ( i − j ) k S(k,i)=\frac{1}{i!}\sum_{j=0}^{i}(-1)^{j}\cdot{i\choose j}\cdot(i-j)^{k} S(k,i)=i!1​j=0∑i​(−1)j⋅(ji​)⋅(i−j)k

由于这是卷积(把组合数拆开嘛),可以 O ( k log ⁡ k ) \mathcal O(k\log k) O(klogk) 一次性求出。于是这道题就做完了。

代码

代码就不写了,妹妹的博客里面有。而且她的思路不一样,是官方题解,我觉得根本不可能想到吧……

标签:CF1528F,二元,Farm,sum,cdot,choose,AmShZ,排序,节点
来源: https://blog.csdn.net/qq_42101694/article/details/117332822

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有