给定长度为 n 的数列 ai,每次随机选择 1 个元素平均分给其他 n−1 个元素,求 k 次操作后 ai 的期望。
数列 ai 的总和始终为定值 s:
s=i=1∑nai
设 j∈[0,k] 次操作后 ai 的期望为 ai,j。特别地,ai,0=ai。
如果 j 次操作选择了 p∈[1,n],则有:
ai,j={0ai,j−1+n−1ap,j−1p=ip=i
因此 ai,j 的期望为:
ai,j=p=1,p=i∑nn1(ai,j−1+n−1ap,j−1)=nn−1⋅ai,j−1+n(n−1)1p=1,p=i∑nap,j−1=nn−1⋅ai,j−1+n(n−1)s−ai,j−1=nn−1⋅ai,j−1+n(n−1)s−n(n−1)1⋅ai,j−1=n(n−1)(n−1)2−1⋅ai,j−1+n(n−1)s=n−1n−2⋅ai,j−1+n(n−1)s
显然 ai,j 的值只与 ai,j−1 有关,这是一个线性递推。设:
x=n−1n−2,y=n(n−1)s
得到 ai,k 的通项公式:
ai,k=xkai,0+y(xk−1+xk−2+⋯+x+1)=xkai,0+y⋅x−1xk−1
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int mod=998244353;
const int N=1000005;
ll a[N];
ll Pow(ll x,ll y)
{
x%=mod;
ll res=1;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,k;
cin>>n>>k;
ll sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum=(sum+a[i])%mod;
}
ll x=(n-2)*Pow(n-1,mod-2)%mod,y=sum*Pow(n,mod-2)%mod*Pow(n-1,mod-2)%mod;
for(int i=1;i<=n;i++)
{
cout<<(Pow(x,k)*a[i]%mod+y*(Pow(x,k)-1)%mod*Pow(x+mod-1,mod-2)%mod)%mod<<' ';
}
return 0;
}