[Codeforces 961G]Partitions
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\) 的贡献只与和它被划分到同一集合的元素的个数有关。
- 如果该元素被单独划分成一组,那么答案的贡献为 \(S(n-1, k-1)\) 。(其中形同 \(S(n, m)\) 的表示第二类斯特林数。)因为它单独分为一组,所以答案贡献为 \(1\) ,只要讨论其他 \(n-1\) 个元素怎么分即可;
- 如果不是单独分为一组,我们考虑用类似的方法来讨论。还是将其他的 \(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的更多相关文章
- 【题解】Codeforces 961G Partitions
[题解]Codeforces 961G Partitions cf961G 好题啊哭了,但是如果没有不小心看了一下pdf后面一页的提示根本想不到 题意 已知\(U=\{w_i\}\),求: \[ \s ...
- CF 961G Partitions
推不动式子 我们考虑每一个$w_i$对答案的贡献,因为题目中定义集合的价值为$W(S) = \left | S \right |\sum_{x \in S}w_x$,这个系数$\left | S \r ...
- [总结]其他杂项数学相关(定理&证明&板子)
目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...
- 【CodeForces】961 G. Partitions 斯特林数
[题目]G. Partitions [题意]n个数$w_i$,每个非空子集S的价值是$W(S)=|S|\sum_{i\in S}w_i$,一种划分方案的价值是所有非空子集的价值和,求所有划分成k个非空 ...
- 「CF 961G」Partitions
题目链接 戳我 \(Solution\) 首先,这个直接推式子.自己推去 所以我们来想一想一些巧妙的方法 \(|S|\sum w_i\) 可以转化为:划分好集合后,每个点都对当前点有\(w_i\)的贡 ...
- Codeforces Global Round 7 C. Permutation Partitions(组合数学)
题意: 给你 n 长全排列的一种情况,将其分为 k 份,取每份中的最大值相加,输出和的最大值和有多少种分法等于最大值. 思路: 取前 k 大值,储存下标,每两个 k 大值间有 vi+1 - vi 种分 ...
- 【CF961G】Partitions(第二类斯特林数)
[CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...
- 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 ...
- Educational Codeforces Round 41
Educational Codeforces Round 41 D. Pair Of Lines 考虑先把凸包找出来,如果凸包上的点数大于\(4\)显然不存在解,小于等于\(2\)必然存在解 否则枚 ...
随机推荐
- 团队作业7——第二次项目冲刺(Beta版本12.10)
项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:头像功能原型设计.头像裁剪功能.头像上传功能.测试 计划完成的内容:头像功能测试.bug修复 每个人的工作 (有work item 的I ...
- 201621123057 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答: (普通方法 / 构造函数)重载. static . final.继承与多态.extends.object类.abstrac ...
- 【iOS】Swift LAZY 修饰符和 LAZY 方法
延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略.另外,有些情况下我们并不会立即用到 ...
- 教你在不使用框架的情况下也能写出现代化 PHP 代码
我为你们准备了一个富有挑战性的事情.接下来你们将以 无 框架的方式开启一个项目之旅. 首先声明, 这篇并非又臭又长的反框架裹脚布文章.也不是推销 非原创 思想 .毕竟, 我们还将在接下来的开发之旅中使 ...
- 从一个事件绑定说起 - DOM
事件绑定的方式 给 DOM 元素绑定事件分为两大类:在 html 中直接绑定 和 在 JavaScript 中绑定. Bind in HTML 在 HTML 中绑定事件叫做内联绑定事件,HTML 的元 ...
- OAuth2.0学习(1-10)新浪开放平台微博认证-手机应用授权和refresh_token刷新access_token
1.当你是使用微博官方移动SDK的移动应用时,授权返回access_token的同时,还会多返回一个refresh_token: JSON 1 2 3 4 5 6 { "access ...
- EasyUI 数据网格行过滤
前段时间发现一个GridView很有用的功能,可以筛选数据,实现起来很简单 一.添加一个引用,这个可以自己去网上下载 <script type="text/javascript&quo ...
- Oracle 用户创建及权限设置
1:创建临时表空间create temporary tablespace user_temp tempfile 'D:\app\Administrator\oradata\ORACLE\xyrj_t ...
- show engine innodb status输出说明
参考链接 (https://dev.mysql.com/doc/refman/5.7/en/innodb-standard-monitor.html) 其中有这样一句: For a descripti ...
- 关于 Integer 值比较的问题
今天刚好遇到这样的问题,别的不说,先上代码 public class TestInteger { public static void main(final String[] args) { fina ...