CF961G
首先我们考虑直接搞
考虑每个元素的贡献,得表达式:
$ans=\sum_{i=1}^{n}w_{i}\sum_{j=1}^{n}jC_{n-1}^{j-1}S(n-j,k-1)$
即枚举每个元素所在集合中元素个数及划分方案数
这个玩意显然是$O(n^{2})$的
有大佬把它化简之后变成了可以直接递推的东西,但是...太恶心了好吗
因此我们换个思想:
我们知道,对于一种划分方式,元素$i$的贡献是$|S|w_{i}$
那么我们可以理解为在这种划分方式下,这个集合中每个元素都产生了$w_{i}$的贡献
那么我们分成两部分来考虑这个问题
首先,一个元素本身无论在哪个集合里都会产生$w_{i}$的贡献,这个贡献是一定的,只与集合划分方法有关,因此这个元素本身对$w_{i}$的贡献是$w_{i}S(n,k)$
接下来,我们考虑其他元素对这个$w_{i}$的贡献:去掉第$i$个元素之后,其他元素仍然可以划分成$k$个集合,划分方案数为$S(n-1,k)$
在每种划分方式下,我们都可以把第$i$个元素放进任意一个集合里面去,产生的贡献等于集合大小*$w_{i}$(注意这个集合大小显然不包含$i$这个元素,因为他本身的贡献我们已经统计过了)
这样的话,对每种划分方式,对$w_{i}$产生的贡献其实都是$(n-1)$,因为每个集合大小加起来就是$(n-1)$
那么表达式就变成了$\sum_{i=1}^{n}w_{i}[S(n,k)+(n-1)S(n-1,k)]$
也就是$[S(n,k)+(n-1)S(n-1,k)]\sum_{i=1}^{n}w_{i}$
注意到第二类斯特林数可以$O(klog_{2}k)$递推,后面那个东西读入的时候累个前缀和即可
第二类斯特林数的递推式:$S(n,m)=\frac{1}{m!}\sum_{i=0}^{m}(-1)^{i}C_{m}^{i}(m-i)^{n}$
贴代码:
#include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> #include <stack> #define ll long long using namespace std; const ll mode=1000000007; ll minv[200005]; ll inv[200005]; ll mul[200005]; ll n,k,s; ll w[200005]; void init() { minv[0]=minv[1]=inv[0]=inv[1]=mul[0]=mul[1]=1; for(int i=2;i<=200000;i++) { inv[i]=(mode-mode/i)*inv[mode%i]%mode; minv[i]=minv[i-1]*inv[i]%mode; mul[i]=mul[i-1]*i%mode; } } ll pow_mul(ll x,ll y) { ll ret=1; while(y) { if(y&1)ret=ret*x%mode; x=x*x%mode,y>>=1; } return ret; } ll C(ll x,ll y) { if(x<y)return 0; return mul[x]*minv[y]%mode*minv[x-y]%mode; } ll get_S(ll x,ll y) { ll ret=0,f=1; for(int i=0;i<=y;i++)ret=(ret+f*C(y,i)*pow_mul(y-i,x)%mode+mode)%mode,f=-f; return ret*minv[y]%mode; } int main() { init(); scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++)scanf("%lld",&w[i]),s=(s+w[i])%mode; printf("%lld\n",s*((get_S(n,k)+(n-1)*get_S(n-1,k)%mode)%mode)%mode); return 0; }
原文地址:https://www.cnblogs.com/zhangleo/p/11136549.html
- jquery事件
- 设计模式专题(二)——策略模式
- ASP.NET AJAX(10)__Authentication ServiceAuthentication ServiceAuthentication Service属性Authentication
- 高效开发 MVVM 和 databinding 你需要使用的工具
- ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预
- 设计模式专题(三)——装饰模式
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件继承时需要注意的问题扩展类型如何修改已有类型
- ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方
- 设计模式专题(四)——代理模式
- Array数组函数(一)
- ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
- 使用 Octave 来学习 Machine Learning(一)
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android碎片fragment实现静态加载的实例代码
- android异步消息机制 源码层面彻底解析(1)
- /undefinedcss/modules/layer/default/layer.css?v=3.1.1找不到的问题
- Android实现渐变启动页和带有指示器的引导页
- the input device is not a TTY. If you are using mintty, try prefixing the comma
- 【STM32F407】第13章 RL-TCPnet V7.X之创建多个TCP客户端
- RecyclerView实现列表倒计时
- wsl设置默认账户为root(ubuntu18.04)
- LeetCode No.14 最长公共前缀
- android异步消息机制 从源码层面解析(2)
- beego解决跨域问题:options请求、axios post请求跨域问题
- Android ListView列表实现倒计时
- [-Flutter 自组篇-] 蛛网图+绘制+动画实践
- Kotlin类型系统竟如此简单
- 以人为本 | Android 11 的消息通知