CodeForces 961G Partitions 题解
题目传送门
题目大意: 有 nnn 个物品,每个物品有一个权值 wiw_iwi,一个集合的权值为 f(S)=∣S∣∑x∈Swxf(S)=|S|\sum_{x\in S} w_xf(S)=∣S∣∑x∈Swx,nnn 件物品的一个划分 RRR 的贡献为 ∑S∈Rf(S)\sum_{S\in R}f(S)∑S∈Rf(S),求所有划分的总贡献。
题解
容易发现一个柿子:
∑i=1nwi∑j=1njCn−1j−1S(n−j,k−1)\sum_{i=1}^n w_i\sum_{j=1}^n jC_{n-1}^{j-1}S(n-j,k-1) i=1∑nwij=1∑njCn−1j−1S(n−j,k−1)
jjj 表示枚举一个物品所在集合的大小,后面一串是计算方案数,其中 SSS 是第二类斯特林数,然后乘上权值就是答案(不难发现每个物品的系数都是一样的)。
看起来求一列斯特林数就可以做完了,但毒瘤的是模数不是 nttnttntt 模数……但似乎巨佬们在这个基础上大力推式子也是能做的。
另一个更简单的办法:原来是考虑一个点所在的集合大小,其实这等价于考虑别的点对自己的贡献(即和自己在同一个集合的方案数),自己对自己的贡献显然是 S(n,k)S(n,k)S(n,k),别的点对自己的贡献是 (n−1)S(n−1,k−1)(n-1)S(n-1,k-1)(n−1)S(n−1,k−1)。
而 S(n,k)S(n,k)S(n,k) 有一个经典的 O(n)O(n)O(n) 容斥求法,这个应该比较众所周知这里就不讲了,代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 200010
#define mod 1000000007int n,k,val;
int fac[maxn],inv[maxn],inv_fac[maxn];
void FacInit(){fac[0]=inv_fac[0]=inv[1]=1;for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;for(int i=2;i<=n;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;for(int i=1;i<=n;i++)inv_fac[i]=1ll*inv_fac[i-1]*inv[i]%mod;
}
int C(int x,int y){return 1ll*fac[x]*inv_fac[y]%mod*inv_fac[x-y]%mod;}
int ksm(int x,int y){int re=1;for(;(y&1?re=1ll*re*x%mod:0),y;y>>=1,x=1ll*x*x%mod);return re;}
int calcS(int x,int y){int re=0;for(int i=0;i<y;i++){re+=1ll*(i&1?-1:1)*C(y,i)*ksm(y-i,x)%mod;re%=mod;re=(re+mod)%mod;}re=1ll*re*inv_fac[y]%mod;return re;
}int main()
{scanf("%d %d",&n,&k);FacInit();for(int i=1,x;i<=n;i++)scanf("%d",&x),val=(val+x)%mod;printf("%lld",1ll*val*(calcS(n,k)+1ll*(n-1)*calcS(n-1,k)%mod)%mod);
}
CodeForces 961G Partitions 题解相关推荐
- c语言1106回文数,Codeforces 1106 简要题解
A题 传送门 读错题还能过样例我给自己点个赞. 题意简述:给一个010101网格SSS,问满足Si,j=Si+1,j+1=Si+1,j−1=Si−1,j−1=Si−1,j+1S_{i,j}=S_{i+ ...
- Educational Codeforces Round 95题解
Educational Codeforces Round 95题解 题目链接 代码链接 A. Buying Torches 题目大意: 你手上现在有一个木棍.有以下两种交换方式: 1.用一个木棍交换x ...
- 【Codeforces div3-498】题解
Codeforces div3-498题解 A. Adjacent Replacements 对于这道题目就比较简单了,如果该数N为奇数,那么经过变换之后不变,如果该数为偶数则变为N - 1 #inc ...
- Codeforces 1110 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...
- codeforces 891E Lust 题解
题目传送门 题目大意: 给出一个长度为 nnn 的序列,进行 kkk 次操作,每次随机选取一个 aia_iai,让答案加上 aaa 序列中的其他数的乘积,然后让 ai−1a_i-1ai−1,问最后 ...
- codeforces round #827题解(完整)
Problem - A - Codeforces 大致意思就是说给定三个数,判断是否存在一个数是另外两个数之和. #include<bits/stdc++.h> using namespa ...
- Codeforces 967 C 题解报告
一.题目 http://codeforces.com/contest/967/problem/C 二.思路 (一)如果是同一楼层,则直接走过去,不用爬楼梯也不用乘电梯. (二)如果是不同楼层,分别计算 ...
- Codeforces 25E Test 题解
题目传送门 题意 给你三个字符串,问最短同时以这三个字符串为子串的字符串的长度是多少. s 1 , s 2 , s 3 ≤ 1 0 5 s1,s2,s3≤10^{5} s1,s2,s3≤105 题解 ...
- Codeforces ECR50 div2题解
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #621题解
A. CowandHaybalesCow\ and\ HaybalesCow and Haybales 贪心模拟题. #include<iostream> #include<ioma ...
最新文章
- saltstack pkg模块用法
- (转)WCF教程系列(1)-创建第一个WCF程序
- 浅谈XSS攻击的那些事(附常用绕过姿势)
- 配置UIAutomator中的ANT环境报不是内部命令与外部命令
- 剑指offer 09.用两个栈实现队列
- 程序人生:初学者最常问的几个问题
- 在宝塔php里留后门,揭秘PHP的一种新型留后门方式
- 一场谷歌与苹果的合作:TensorFlow Lite开始支持Core ML
- JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
- 运筹优化(十二)--带约束非线性规划(NLP)
- unity数组或链表需要空间很大赋值与调用
- 创业公司中运营人员的典型一天是怎么度过的?
- 一次算法作业hhhhhh
- 新零售新模式:完整了解「快闪店」运作
- 基于android的个人理财软件 android stu_Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)...
- 2021-09-07体脂秤模块用来做什么?开发八电极体脂秤方案
- [转] 给土鳖装上鹰的翅膀和眼睛后会怎么样?
- 前端Base64编码(兼容IE8)
- IntelliJ IDEA V2022.1版本亮点——改进框架与技术
- SafeSignCertReg.exe导致系统工作异常