CF961G Partitions
题意:自己看。懒得写了。
在深切感受到一个压根不接受核的人找一个核狗要日推的痛苦之后我看到了这个东西。
首先看见这种数数题直接翻一下题解看代码长度,发现第一篇人畜无害的正常推式子题代码长度于是放心推。
然后我们可以列出来这么一个人畜无害的式子:
\[\sum_{i=1}^nw_i\sum_{j=1}^nj\binom{n-1}{j-1}\begin{Bmatrix}n-j\\k-1\end{Bmatrix} \]球球了我真的很不想在大晚上的时候还要写一车注解。直接把后边系数扒出来。
\[\begin{aligned} &\sum_{i=1}^ni\binom{n-1}{i-1}\begin{Bmatrix}n-i\\k-1\end{Bmatrix}\\ =&\sum_{i=1}^ni\binom{n-1}{i-1}\frac 1{(k-1)!}\sum_{j=0}^{k-1}(-1)^{k-1-j}\binom{k-1}jj^{n-i}\\ =&\sum_{j=0}^{k-1}\frac{(-1)^{k-1-j}}{(k-1-j)!}\frac 1{j!}\sum_{i=1}^ni\binom{n-1}{i-1}j^{n-i}\\ &\sum_{i=1}^ni\binom{n-1}{i-1}j^{n-i}\\ =&\sum_{i=1}^n(i-1)\binom{n-1}{i-1}j^{n-i}+\sum_{i=1}^n\binom{n-1}{i-1}j^{n-i}\\ =&(n-1)\sum_{i=1}^n\binom{n-2}{i-2}j^{n-i}+\sum_{i=1}^n\binom{n-1}{i-1}j^{n-i}\\ =&(n-1)(j+1)^{n-2}+(j+1)^{n-1}\\ =&(n+j)(j+1)^{n-2} \end{aligned} \]所以系数就是
\[\sum_{j=0}^{k-1}\frac{(-1)^{k-1-j}}{(k-1-j)!}\frac{n+j}{j!}(j+1)^{n-2} \]完事。特判 \(n=k=1\)。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int mod=1000000007;
int n,k,ans,sum,jc[200010],inv[200010];
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);jc[0]=inv[0]=1;
for(int i=1;i<=n;i++)jc[i]=1ll*jc[i-1]*i%mod;
inv[n]=qpow(jc[n],mod-2);
for(int i=n-1;i>=1;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod;
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);sum=(sum+x)%mod;
}
if(n==1&&k==1){
printf("%d\n",sum);return 0;
}
for(int j=0;j<k;j++){
ans=(ans+1ll*((k-j&1)?1:mod-1)*inv[k-j-1]%mod*inv[j]%mod*(n+j)%mod*qpow(j+1,n-2))%mod;
}
ans=1ll*ans*sum%mod;
printf("%d\n",ans);
return 0;
}
然而没有完全完。
看了看题解发现了标题的玄妙。
首先我们这个东西可以变成这所有的分组方案中共有多少元素和 \(i\) 分在一组。那么 \(i\) 自己对自己的贡献显然是 \(\begin{Bmatrix}n\\k\end{Bmatrix}\)。考虑其他元素,可以看做强制和 \(i\) 绑定,这样还有 \(n-1\) 个元素,那么总贡献就是
\[\begin{Bmatrix}n\\k\end{Bmatrix}+(n-1)\begin{Bmatrix}n-1\\k\end{Bmatrix} \]拆一下是和上边一坨一样的东西。
标签:begin,end,组合,意义,int,sum,一道,Bmatrix,binom From: https://www.cnblogs.com/gtm1514/p/17090438.html