【学习笔记】CF961G Partitions
不难推出式子: ∑ a i ∑ i = 1 n i ( n − 1 i − 1 ) { n − i k − 1 } \sum a_i\sum_{i=1}^ni\binom{n-1}{i-1}\begin{Bmatrix}n-i \\ k-1\end{Bmatrix} ∑aii=1∑ni(i−1n−1){n−ik−1}
注意到模数是 
     
      
       
       
         1 
        
        
        
          0 
         
        
          9 
         
        
       
         + 
        
       
         7 
        
       
      
        10^9+7 
       
      
    109+7因此正解显然不是多项式。况且多项式对我这个萌新不太友好
奈何我是丝薄
我们要算 ∑ ( i + 1 ) ( n i ) { n − i k − 1 } \sum (i+1) \binom{n}{i}\begin{Bmatrix}n-i\\ k-1\end{Bmatrix} ∑(i+1)(in){n−ik−1}
把 i + 1 i+1 i+1拆开
显然 ∑ i ( n i ) { n − i k − 1 } = n { n k } \sum i\binom{n}{i}\begin{Bmatrix}n-i\\ k-1\end{Bmatrix}=n\begin{Bmatrix}n\\ k\end{Bmatrix} ∑i(in){n−ik−1}=n{nk}
∑ ( n i ) { n − i k − 1 } = k { n k } + { n k − 1 } \sum \binom{n}{i}\begin{Bmatrix}n-i\\ k-1\end{Bmatrix}=k\begin{Bmatrix}n\\ k\end{Bmatrix}+\begin{Bmatrix}n\\ k-1\end{Bmatrix} ∑(in){n−ik−1}=k{nk}+{nk−1}
所以 ∑ ( i + 1 ) ( n i ) { n − i k − 1 } = ( n + k ) { n k } + { n k − 1 } \sum (i+1)\binom{n}{i}\begin{Bmatrix}n-i\\ k-1\end{Bmatrix}=(n+k)\begin{Bmatrix}n\\ k\end{Bmatrix}+\begin{Bmatrix}n\\ k-1\end{Bmatrix} ∑(i+1)(in){n−ik−1}=(n+k){nk}+{nk−1}
利用通项公式直接算即可。
坑点:把系数 
     
      
       
       
         i 
        
       
      
        i 
       
      
    i抄掉了,以及没有考虑到 
     
      
       
       
         i 
        
       
         = 
        
       
         0 
        
       
      
        i=0 
       
      
    i=0这一项。于是自闭了一个晚上
我真是纯纯的fw啊
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define db long double
#define cpx complex<db>
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int mod=1e9+7;
int n,K;
ll a[200005],fac[200005],inv[200005],res;
ll pw(ll x,ll y=mod-2){
	ll z(1);
	for(;y;y>>=1){
		if(y&1)z=z*x%mod;
		x=x*x%mod;
	}return z;
}
void init(int n){
	fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;
	inv[n]=pw(fac[n]);for(int i=n;i>=1;i--)inv[i-1]=inv[i]*i%mod;
}
ll binom(int x,int y){
	return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
ll S(int n,int K){
	ll res(0);
	for(int i=0;i<=K;i++){
		if(K-i&1)res=(res-binom(K,i)*pw(i,n))%mod;
		else res=(res+binom(K,i)*pw(i,n))%mod;
	}return res*inv[K]%mod;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>K,init(n);for(int i=1;i<=n;i++)cin>>a[i],res=(res+a[i])%mod;
	res=((n+K-1)*S(n-1,K)+S(n-1,K-1))%mod*res%mod;
	cout<<(res+mod)%mod;
}

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号