[ABC231G] Balls in Boxes
题解
我们记
bi 为
i 被选中的次数,那么期望得分为
nk1b1+b2+⋯+bn=k∑(b1,b2,…,bnn)i=1∏n(ai+bi)
=nkk!b1,b2,…,bn∑i=1∏nbi!ai+bi
考虑构造 EGF:
F^i(x)=j=0∑∞j!ai+jxj
=aij=0∑∞j!1xj+j=0∑∞(j−1)!1xj
=aiex+xex
=(ai+x)ex
那么答案转化为:
[xk](nkk!i=1∏nF^i(x))
=[xk](nkk!enxi=1∏n(ai+x))
我们把
i=1∏n(ai+x) 展开成
i=0∏ncixi。这一步可以
O(n2) 暴力做,也可以用一些多项式做法做到
O(nlog2n)。
=nkk!i=0∑min(n,k)ci(k−i)!nk−i
=i=0∑min(n,k)cikin−i
代码
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010,mod=998244353;
ll n,k,c[N],a[N];
ll qpow(ll x,ll y){
ll ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;
y>>=1;
}
return ret;
}
int main(){
cin>>n>>k;
c[0]=1;
for(int i=1;i<=n;i++){
cin>>a[i];
for(int j=n;j;j--)c[j]=(a[i]*c[j]+c[j-1])%mod;
c[0]=c[0]*a[i]%mod;
}
ll ans=0,fac=1,p=1,inv=qpow(n,mod-2);
for(int i=0;i<=min(n,k);i++){
ans=(ans+c[i]*fac%mod*p%mod)%mod;
fac=fac*(k-i)%mod;p=p*inv%mod;
}
cout<<ans;
}