标签:大小 16px 计算 style def ons end mat blank
【题目】G. Partitions
【题意】n个数$w_i$,每个非空子集S的价值是$W(S)=|S|\sum_{i\in S}w_i$,一种划分方案的价值是所有非空子集的价值和,求所有划分成k个非空子集的方案的价值和。1<=k<=n<=2*10^5,1<=wi<=10^9。
【算法】斯特林数
【题解】首先价值与具体数字没有关系,即:
$$ans=num*\sum_{i=1}^{n}w_i$$
其中num表示1在每个k划分方案中所在集合的大小的和。
考虑一种角度,所在集合的大小可以视为所在集合的每个数字贡献了1的价值,那么答案就是1和每个数字在同一个集合的方案数,即:
$$num=\begin{Bmatrix}n\\ k\end{Bmatrix}+(n-1)*\begin{Bmatrix}n-1\\ k\end{Bmatrix}$$
其中1自己的贡献是s(n,k),其余n-1个数字的贡献是将它和1视为整体的方案数s(n-1,k)。
斯特林数可以用通项公式O(k)计算,总复杂度O(n ln n)。
以上是正解,但一般人很容易yy出下面的等式:
$$num$$
【CodeForces】G. Partitions 斯特林数
标签:大小 16px 计算 style def ons end mat blank
原文地址:https://www.cnblogs.com/onioncyc/p/8821579.html