CF961G Partitions(斯特林数+二项式定理)
CF961G Partitions
拆开计算每个物品的贡献,容易得到
法一:直接无脑MTT(然而我不会)
法二(暴力推式子):前半部分可以直接加起来,化开后半部分
如果没有
代回原式,设
法三(更聪明的做法,考虑组合意义):
对于
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace FGF
{
int n,m;
const int mo=1e9+7,N=2e5+5;
int qpow(int x,int y)
{
int s=1;
while(y)
{
if(y&1)s=1ll*s*x%mo;
x=1ll*x*x%mo;
y>>=1;
}
return s;
}
int sum,ans,fac[N];
void work()
{
scanf("%d%d",&n,&m);
fac[0]=1;
for(int i=1,a;i<=n;i++)
scanf("%d",&a),sum=(sum+a)%mo;
if(n==1){printf("%d\n",sum);return;}
for(int i=1;i<=m;i++)
fac[i]=1ll*fac[i-1]*i%mo;
fac[m]=qpow(fac[m],mo-2);
for(int i=m-1;i;i--)
fac[i]=1ll*fac[i+1]*(i+1)%mo;
for(int i=0;i<m;i++)
ans=(ans+((m-i-1)&1? -1ll:1ll)*fac[m-i-1]*fac[i]%mo*qpow(i+1,n-2)%mo*(n+i)%mo+mo)%mo;
printf("%lld",1ll*sum*ans%mo);
}
}
int main()
{
FGF::work();
return 0;
}