Description

题库链接

给你 \(n\) 个不同的元素组成的集合 \(R\) ,每个元素有一个权值 \(w\) 。对于一个子集集合 \(S\) ,它的价值为 \(W(S)=|S|\cdot\sum\limits_{i\in S}w_i\) 。现要求将该集合 \(R\) 划分成 \(k\) 个互不相交的非空子集 \(S_i\) 。定义一种划分的价值为 \(\sum\limits_{i=1}^k W(S_i)\) 。求所有划分的价值和。对大质数取模。

\(1\leq k\leq n\leq 2\cdot 10^5\)

Solution

容易发现对于不同的元素,他对答案的贡献本质是相同的。即我们只要求出某一种元素在所有方案中出现的次数 \(sum\) ,那么答案就是 \(sum\times \sum\limits_{i=1}^n w_i\) 。

考虑如何求 \(sum\) 。

容易发现它对 \(sum\) 的贡献只与和它被划分到同一集合的元素的个数有关。

  1. 如果该元素被单独划分成一组,那么答案的贡献为 \(S(n-1, k-1)\) 。(其中形同 \(S(n, m)\) 的表示第二类斯特林数。)因为它单独分为一组,所以答案贡献为 \(1\) ,只要讨论其他 \(n-1\) 个元素怎么分即可;
  2. 如果不是单独分为一组,我们考虑用类似的方法来讨论。还是将其他的 \(n-1\) 个元素先分好,共 \(S(n-1,k)\) 种。接下来考虑剩下的元素该如何放。对于一种划分 \(n-1\) 个元素的情况。我们记每一个子集元素个数为 \(a_i\) 。那么答案应该是 \(\sum\limits_{i=1}^k a_i+1\) 。不过因为 \(\sum\limits_{i=1}^k a_i=n-1\) ,所以在这种划分情况下,该元素的贡献就是 \(n+k-1\) 。故总贡献为 \((n+k-1)\cdot S(n-1, k)\) 。

综上答案就是 \((S(n-1,k-1)+(n+k-1)\cdot S(n-1, k))\cdot\sum\limits_{i=1}^n w_i\) 。

\(S(n,m)\) 用通项公式计算就好了。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5, yzh = 1e9+7; int x, n, k, inv[N+5]; int quick_pow(int a, int b) {
int ans = 1;
while (b) {
if (b&1) ans = 1ll*ans*a%yzh;
a = 1ll*a*a%yzh, b >>= 1;
}
return ans;
}
int S(int n, int m) {
int ans = 0;
for (int i = 0; i <= m; i++) {
int t = 1ll*inv[i]*inv[m-i]%yzh*quick_pow(m-i, n)%yzh;
if (i&1) (ans -= t) %= yzh;
else (ans += t) %= yzh;
}
return ans;
}
void work() {
scanf("%d%d", &n, &k); inv[0] = inv[1] = 1;
for (int i = 2; i <= k; i++) inv[i] = -1ll*yzh/i*inv[yzh%i]%yzh;
for (int i = 1; i <= k; i++) inv[i] = 1ll*inv[i-1]*inv[i]%yzh;
int sum = 0;
for (int i = 1; i <= n; i++) scanf("%d", &x), (sum += x) %= yzh;
int ans = (S(n-1, k-1)+1ll*(n+k-1)*S(n-1, k)%yzh)%yzh;
ans = 1ll*ans*sum%yzh;
printf("%d\n", (ans+yzh)%yzh);
}
int main() {work(); return 0; }

[Codeforces 961G]Partitions的更多相关文章

  1. 【题解】Codeforces 961G Partitions

    [题解]Codeforces 961G Partitions cf961G 好题啊哭了,但是如果没有不小心看了一下pdf后面一页的提示根本想不到 题意 已知\(U=\{w_i\}\),求: \[ \s ...

  2. CF 961G Partitions

    推不动式子 我们考虑每一个$w_i$对答案的贡献,因为题目中定义集合的价值为$W(S) = \left | S \right |\sum_{x \in S}w_x$,这个系数$\left | S \r ...

  3. [总结]其他杂项数学相关(定理&证明&板子)

    目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...

  4. 【CodeForces】961 G. Partitions 斯特林数

    [题目]G. Partitions [题意]n个数$w_i$,每个非空子集S的价值是$W(S)=|S|\sum_{i\in S}w_i$,一种划分方案的价值是所有非空子集的价值和,求所有划分成k个非空 ...

  5. 「CF 961G」Partitions

    题目链接 戳我 \(Solution\) 首先,这个直接推式子.自己推去 所以我们来想一想一些巧妙的方法 \(|S|\sum w_i\) 可以转化为:划分好集合后,每个点都对当前点有\(w_i\)的贡 ...

  6. Codeforces Global Round 7 C. Permutation Partitions(组合数学)

    题意: 给你 n 长全排列的一种情况,将其分为 k 份,取每份中的最大值相加,输出和的最大值和有多少种分法等于最大值. 思路: 取前 k 大值,储存下标,每两个 k 大值间有 vi+1 - vi 种分 ...

  7. 【CF961G】Partitions(第二类斯特林数)

    [CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...

  8. Codeforces Beta Round #97 (Div. 1) B. Rectangle and Square 暴力

    B. Rectangle and Square 题目连接: http://codeforces.com/contest/135/problem/B Description Little Petya v ...

  9. Educational Codeforces Round 41

    Educational Codeforces Round 41  D. Pair Of Lines 考虑先把凸包找出来,如果凸包上的点数大于\(4\)显然不存在解,小于等于\(2\)必然存在解 否则枚 ...

随机推荐

  1. Beta第五天

    听说

  2. Linux kernel 的 sendfile 是如何提高性能的

    Linux kernel 的 sendfile 是如何提高性能的 现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? ...

  3. vivado License导入方法与资源获取

    前言 以下安装说明基于已经正确安装vivado 笔者操作环境:linux vivado版本:2015.2 vivado License导入方法: 点击菜单栏[Help],选择[Manage Licen ...

  4. Flask 学习 四 数据库

    class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primary_key=True) name = db.Co ...

  5. Java代码风格和在idea中的一些设置

    源文件基本设置 1. 文件名 驼峰标识,.java结尾 2. 编码 统一为UTF-8 Transport...可以解决property文件不能正常显示为中文的问题 3. 特殊字符 尽量使用转义字符(\ ...

  6. JAVA_SE基础——58.如何用jar命令对java工程进行打包

    有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍, ...

  7. Spark学习笔记之RDD中的Transformation和Action函数

    总算可以开始写第一篇技术博客了,就从学习Spark开始吧.之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pys ...

  8. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  9. kubernetes入门(03)kubernetes的基本概念

    一.Pod 在Kubernetes集群中,Pod是创建.部署和调度的基本单位.一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个应用的容器.在同一个Pod内部,多个容器共享存储.网络IP,以 ...

  10. python入门(13)获取函数帮助和调用函数

    Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...