OriginalNov 19, 2025 460 words 2 min题解:P14514 [NFLSPC #8] 如何区分北京东路和北京东路 Summary 给定长度 n 的数列,每次随机选一个元素清零并把它平均分给其他 n 减 1 个元素,求 k 次操作后每个位置的期望,对 998244353 取模。数列总和恒为定值。对单个位置写出一步期望,化简成关于上一步的线性递推,系数为 (n-2)/(n-1),常数项含总和,再套等比数列求和得到通项公式,用快速幂和逆元计算。时间复杂度 O(nlogk)。
给定长度为 n n n 的数列 a i a_i a i ,每次随机选择 1 1 1 个元素平均分给其他 n − 1 n-1 n − 1 个元素,求 k k k 次操作后 a i a_i a i 的期望。
数列 a i a_i a i 的总和始终为定值 s s s :
s = ∑ i = 1 n a i s=\sum_{i=1}^n a_i s = i = 1 ∑ n a i
设 j ∈ [ 0 , k ] j\in[0,k] j ∈ [ 0 , k ] 次操作后 a i a_i a i 的期望为 a i , j a_{i,j} a i , j 。特别地,a i , 0 = a i a_{i,0}=a_i a i , 0 = a i 。
如果 j j j 次操作选择了 p ∈ [ 1 , n ] p\in[1,n] p ∈ [ 1 , n ] ,则有:
a i , j = { 0 p = i a i , j − 1 + a p , j − 1 n − 1 p ≠ i a_{i,j}=
\begin{cases}
0 & p=i \\
a_{i,j-1}+\frac{a_{p,j-1}}{n-1} & p\ne i
\end{cases} a i , j = { 0 a i , j − 1 + n − 1 a p , j − 1 p = i p = i
因此 a i , j a_{i,j} a i , j 的期望为:
a i , j = ∑ p = 1 , p ≠ i n 1 n ( a i , j − 1 + a p , j − 1 n − 1 ) = n − 1 n ⋅ a i , j − 1 + 1 n ( n − 1 ) ∑ p = 1 , p ≠ i n a p , j − 1 = n − 1 n ⋅ a i , j − 1 + s − a i , j − 1 n ( n − 1 ) = n − 1 n ⋅ a i , j − 1 + s n ( n − 1 ) − 1 n ( n − 1 ) ⋅ a i , j − 1 = ( n − 1 ) 2 − 1 n ( n − 1 ) ⋅ a i , j − 1 + s n ( n − 1 ) = n − 2 n − 1 ⋅ a i , j − 1 + s n ( n − 1 ) \begin{aligned}
a_{i,j} & =\sum_{p=1,p\ne i}^n\frac{1}{n}\left(a_{i,j-1}+\frac{a_{p,j-1}}{n-1}\right) \\
& =\frac{n-1}{n}\cdot a_{i,j-1}+\frac{1}{n(n-1)}\sum_{p=1,p\ne i}^n a_{p,j-1} \\
& =\frac{n-1}{n}\cdot a_{i,j-1}+\frac{s-a_{i,j-1}}{n(n-1)} \\
& =\frac{n-1}{n}\cdot a_{i,j-1}+\frac{s}{n(n-1)}-\frac{1}{n(n-1)}\cdot a_{i,j-1} \\
& =\frac{(n-1)^2-1}{n(n-1)}\cdot a_{i,j-1}+\frac{s}{n(n-1)} \\
& =\frac{n-2}{n-1}\cdot a_{i,j-1}+\frac{s}{n(n-1)}
\end{aligned} a i , j = p = 1 , p = i ∑ n n 1 ( a i , j − 1 + n − 1 a p , j − 1 ) = n n − 1 ⋅ a i , j − 1 + n ( n − 1 ) 1 p = 1 , p = i ∑ n a p , j − 1 = n n − 1 ⋅ a i , j − 1 + n ( n − 1 ) s − a i , j − 1 = n n − 1 ⋅ a i , j − 1 + n ( n − 1 ) s − n ( n − 1 ) 1 ⋅ a i , j − 1 = n ( n − 1 ) ( n − 1 ) 2 − 1 ⋅ a i , j − 1 + n ( n − 1 ) s = n − 1 n − 2 ⋅ a i , j − 1 + n ( n − 1 ) s
显然 a i , j a_{i,j} a i , j 的值只与 a i , j − 1 a_{i,j-1} a i , j − 1 有关,这是一个线性递推。设:
x = n − 2 n − 1 , y = s n ( n − 1 ) x=\frac{n-2}{n-1},y=\frac{s}{n(n-1)} x = n − 1 n − 2 , y = n ( n − 1 ) s
得到 a i , k a_{i,k} a i , k 的通项公式:
a i , k = x k a i , 0 + y ( x k − 1 + x k − 2 + ⋯ + x + 1 ) = x k a i , 0 + y ⋅ x k − 1 x − 1 \begin{aligned}
a_{i,k} & =x^ka_{i,0}+y\left(x^{k-1}+x^{k-2}+\dots+x+1\right) \\
& =x^k a_{i,0}+y\cdot\frac{x^k-1}{x-1}
\end{aligned} a i , k = x k a i , 0 + y ( x k − 1 + x k − 2 + ⋯ + x + 1 ) = x k a i , 0 + y ⋅ x − 1 x k − 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 ;
}