题解 CF961G 【Partitions】
题目大意
给出\(n,k\),以及\(w_{1,2,..,n}\),定义一个集合\(S\)的权值\(W(S)=|S|\sum_{x\in S} w_x\),定义一个划分\(R\)的权值为\(\sum_{S\in R} W(S)\)。求出每种划分权值之和。
思路
这个题目有两种方法。一种就是直接从一眼式中暴推出答案,另外一种就是考虑组合意义,这里着重介绍后面一种。
我们发现\(W(S)\)实际上就等价于在\(S\)中的元素会对该集合中每个元素提供\(w_i\)的贡献。于是,我们考虑一个点会产生的贡献,首先对它自己会有\(w_i\begin{Bmatrix}n\\k\end{Bmatrix}\)的贡献,对其他点有\((n-1)\begin{Bmatrix}n-1\\k\end{Bmatrix}w_i\)的贡献。这里解释一下后面那个,可以理解为先把\(n-1\)个分到\(k\)个盒子里(如果要产生贡献肯定要有跟它在同一个集合的元素),然后我可以加到这\(k\)里面任意一个,一共就是\(n-1\)个元素。
于是,我们得到答案就是:
\]
\(\texttt{Code}\)
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define mod 1000000007
#define MAXN 200005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int n,k,w[MAXN],fac[MAXN],ifac[MAXN];
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
int binom (int a,int b){return a >= b ? mul (fac[a],mul (ifac[b],ifac[a - b])) : 0;}
int qkpow (int a,int b){int res = 1;for (;b;b >>= 1,a = mul(a,a)) if (b & 1) res = mul (res,a) % mod;return res;}
int Sitelin (int n,int m){int res = 0;for (Int i = 0,tmp;i <= m;++ i) tmp = mul (binom (m,i),qkpow (i,n)),m - i & 1 ? (res = dec (res,tmp)) : (res = add (res,tmp));return 1ll * res * ifac[m] % mod;}
signed main(){
read (n,k);fac[0] = 1;int sum = 0;
for (Int i = 1;i <= n;++ i) read (w[i]),sum = add (sum,w[i]);
for (Int i = 1;i <= k;++ i) fac[i] = mul (fac[i - 1],i);ifac[k] = qkpow (fac[k],mod - 2);for (Int i = k;i;-- i) ifac[i - 1] = mul (ifac[i],i);
write (mul (sum,add (Sitelin (n,k),mul (n - 1,Sitelin (n - 1,k))))),putchar ('\n');
return 0;
}
题解 CF961G 【Partitions】的更多相关文章
- 题解 [CF961G] Partitions
题面 解析 首先我们观察这个定义, 可以发现每个元素在统计答案时是平等的, 也就是单个元素的权值对答案没有特别的影响. 设元素权值为\(w[i]\), 那么我们就可以知道答案是\(\sum_{i=1} ...
- CF961G Partitions(第二类斯特林数)
题目 CF961G 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 相信大家能得出一个一眼式:\[Ans=\sum\limits_{i=1}^n w_i\sum\limi ...
- CF961G Partitions
传送门 luogu 显然每个数的贡献可以一起算感性理解一下,于是答案就是权值总和乘以每个数被算了几次 那个"集合大小为\(|S|\)的集合权值为权值和乘\(|S|\)",可以看成一 ...
- CF961G Partitions(第二类斯特林数)
传送门 对于每一个元素,我们只要能求出它的出现次数\(sum\),那么每个元素的贡献都是一样的,最终的答案为\(sum\times \sum_{i=1}^n w_i\) 那么分别讨论 如果这个元素自己 ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- 【CF961G】Partitions 第二类斯特林数
[CF961G]Partitions 题意:给出n个物品,每个物品有一个权值$w_i$,定义一个集合$S$的权值为$W(S)=|S|\sum\limits_{x\in S} w_x$,定义一个划分的权 ...
- 【CF961G】Partitions(第二类斯特林数)
[CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...
- 【题解】Codeforces 961G Partitions
[题解]Codeforces 961G Partitions cf961G 好题啊哭了,但是如果没有不小心看了一下pdf后面一页的提示根本想不到 题意 已知\(U=\{w_i\}\),求: \[ \s ...
- 【cf961G】G. Partitions(组合意义+第二类斯特林数)
传送门 题意: 给出\(n\)个元素,每个元素有价值\(w_i\).现在要对这\(n\)个元素进行划分,共划分为\(k\)组.每一组的价值为\(|S|\sum_{i=0}^{|S|}w_i\). 最后 ...
随机推荐
- 战胜了所有对手,却输给了时代。MVVM--jQuery永远的痛。
前言 第二次浏览器战争中,随着以 Firefox 和 Opera 为首的 W3C 阵营与 IE 对抗程度的加剧,浏览器碎片化问题越来越严重,不同的浏览器执行不同的标准,对于开发人员来说这是一个恶梦.为 ...
- Java - 记录01_开发环境搭建
时间:2017-07-04 记录:byzqy 一.什么是JDK JDK(Java Development Kit):Java开发工具集,即Java语言的软件开发工具包. SDK(Software De ...
- n个容器取油问题再探
在 韩信分油问题的拓展分析 里,最后给出了一般性的结论,即: 用 n (n > 1) 个不规则无刻度的容器从一个无穷大的油桶里取油,这些容器容量都为整数升,分别记为 a1, a2, ..., a ...
- MySQL数据完整性约束
主键约束 主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合:其中,由多个列组合而成的主键也称为复合主键.在MySQL中,主键列必须遵守以下规则. (1)每一个表只能定义一个主键. (2)唯 ...
- Docker | 入门 & 基础操作
Dcoker 入门 确保docker 已经安装好了,如没有装好的可以参考:Docker | 安装 运行第一个容器 docker run -it ubuntu /bin/bash docker run ...
- Linux下用Sed查找IP地址
ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...
- rtl8188eu 驱动移植
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 rtl8188eu 驱动移植 在网上下载Linux版的驱动源码: wifi驱动的实现有 ...
- MySQL实战45讲(21--25)-笔记
21 | 为什么我只改一行的语句,锁这么多? 加锁规则里面:包含了两个"原则".两个"优化"和一个"bug". 原则 1:加锁的基本单位是 ...
- utittest和pytest中mock的使用详细介绍
头号玩家 模拟世界 单元测试库介绍 mock Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为. python3.3 ...
- liquibase新增字段注释导致表格注释同时变更bug记录
liquibase是一个用于数据库变更跟踪.版本管理和自动部署的开源工具.它的使用方式方法可以参考官方文档或者其他人的博客,这里不做过多介绍. 1. 问题复现 在使用过程中发现了一个版本bug.这个b ...