题解 [CF961G] Partitions
解析
首先我们观察这个定义,
可以发现每个元素在统计答案时是平等的,
也就是单个元素的权值对答案没有特别的影响.
设元素权值为\(w[i]\),
那么我们就可以知道答案是\(\sum_{i=1}^nw[i]\)乘上一个系数.
而我们再次观察问题中的一个式子\(\left\vert s \right\vert*\sum\limits_iw[i]\),
实际上也就是把\(\sum\limits_iw[i]\)加了\(\left\vert s \right\vert\)次.
所以我们可以把它看成是集合中的每个元素都对答案造成了\(\sum\limits_iw[i]\)的贡献.
而贡献有两种情况:
元素自己给自己贡献
这显然是总情况数\(S(n,k)\),\(S\)为第二类斯特林数.
元素\(j\)给\(i\)贡献(\(j!=i\))
这里的情况数是\((n-1)*S(n-1,k)\).
我们可以理解为先把除了\(i\)的元素分好,再把\(i\)加到其中一个里面.
因为有还\(n-1\)个元素所以要乘\((n-1)\).
最后,答案就是\((S(n,k)+(n-1)*S(n-1,k))*\sum_{i=1}^nw[i]\).
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
#define int ll
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=200001;
const int Mod=1000000007;
int n,m,sum,f,jc[N];
inline int fp(int a,int b){
int ret=1;
while(b){
if(b&1) ret=(ll)ret*a%Mod;
a=(ll)a*a%Mod;b>>=1;
}
return ret;
}
inline int inv(int x){
return fp(x,Mod-2);
}
inline int stir(int n,int k){
int ret=0;
for(int j=0;j<k;j++) ret=(ret+fp(k-j,n)*inv(jc[j])%Mod*inv(jc[k-j])*((j&1)? -1:1))%Mod;
return ret;
}
signed main(){
n=read();m=read();jc[0]=1;
for(int i=1;i<=n;i++) sum=(sum+read())%Mod;
for(int i=1;i<=m;i++) jc[i]=jc[i-1]*i%Mod;
int ans=sum*(stir(n,m)+stir(n-1,m)*(n-1)%Mod)%Mod;
printf("%lld\n",(ans+Mod)%Mod);
return 0;
}
题解 [CF961G] Partitions的更多相关文章
- 题解 CF961G 【Partitions】
题目传送门 题目大意 给出\(n,k\),以及\(w_{1,2,..,n}\),定义一个集合\(S\)的权值\(W(S)=|S|\sum_{x\in S} w_x\),定义一个划分\(R\)的权值为\ ...
- 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\). 最后 ...
随机推荐
- SQL SERVER导入EXCEL文件:无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Ace.OLEDB.12.0" 的实例。
[方法一] --开启导入功能 exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'A ...
- oracle父子级查询数据树结构
select t.*, level , sys_connect_by_path (t .id, '-->') as tree from isc_res_res_r t connect by pr ...
- flink两种安装方式
Flink Standalone 集群 HA 配置 1. HA 集群环境规划 使用三台节点实现两主两从集群(由于笔记本性能限制,不能开启太多虚拟机,其实使用三 台和四台机器在安装配置上没有本质区别) ...
- Kubernetes---Pod笔记
⒈pod的理解 将多个容器镜像融合在一起,共享网络命名空间及容器卷 ⒉pod的分类 自助式podv 不是被控制器管理的pod,它一旦死亡不会被人给拉起来. 控制器管理的pod ...
- vs code在打开新文件是覆盖上一个窗口的问题
设置里面有个 enablePreview 去掉就好
- Elastic Search快速上手(4):细节补充
模糊搜索 可以进行模糊搜索: GET job/type1/_search { "query":{ "fuzzy":{ "title":{ & ...
- LeetCode 腾讯精选50题--子集
根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...
- 充值css样式
@charset "utf-8"; /*reset CSS*/ body,ul,ol,dl,dd,h1,h2,h3,h4,h5,h6,figure,form,fieldset,le ...
- vue学习(7)-路由抽离
cnpm i vue-router -S
- Oracle 如何查看当前的实例及切换实例
一.Oracle查看当前实例 1.打开终端,输入命令sqlpuls / as sysdba连接到数据库 2.输入命令show parameter name便可以查看当前登录数据库的参数配置,如下可以看 ...