神仙题!(原题链接)
对于这样的题,先不要绕到具体操作里出不来。我们先把复杂的式子进行变形。
对于题中式子,先不考虑翻转,设 p p p 为给定排列。则:
f ( p ) = ∑ i < j [ p i > p j ] ( j − i ) = ∑ 1 ≤ i < j ≤ n , p i > p j ( j − i ) = ∑ 1 ≤ i < j ≤ n , p i > p j j − ∑ 1 ≤ i < j ≤ n , p i > p j i \begin{aligned} f(p)&=\sum_{i<j}[p_i>p_j](j-i) \\ &=\sum_{1\le i<j\le n,p_i>p_j}(j-i) \\ &=\sum_{1\le i<j\le n,p_i>p_j}j_{}-_{}\sum_{1\le i<j\le n,p_i>p_j}i \end{aligned} f(p)=i<j∑[pi>pj](j−i)=1≤i<j≤n,pi>pj∑(j−i)=1≤i<j≤n,pi>pj∑j−1≤i<j≤n,pi>pj∑i
此时式子依然很复杂,考虑拆解 i i i 的贡献。则:
f ( p ) = ∑ i = 1 n i ∑ j = 1 i [ p i < p j ] − ∑ i = 1 n i ∑ j = i + 1 n [ p i > p j ] = ∑ i = 1 n ( ∑ j = 1 i [ p i < p j ] − ∑ j = i + 1 n [ p i > p j ] ) \begin{aligned} f(p)&=\sum_{i=1}^{n}i\sum_{j=1}^{i}[p_i<p_j]-\sum_{i=1}^{n}i\sum_{j=i+1}^{n}[p_i>p_j] \\ &=\sum_{i=1}^{n}\left ( \sum_{j=1}^{i}[p_i<p_j]-\sum_{j=i+1}^{n}[p_i>p_j] \right ) \end{aligned} f(p)=i=1∑nij=1∑i[pi<pj]−i=1∑nij=i+1∑n[pi>pj]=i=1∑n(j=1∑i[pi<pj]−j=i+1∑n[pi>pj])
此时再考虑括号内的式子还能怎么简化。注意到 [ 1 , i ] [1,i] [1,i] 中大于 p i p_i pi 的数,实际上就是 i i i 减去区间内小于 p i p_i pi 的数。故:
f ( p ) = ∑ i = 1 n i ( i − ∑ j = 1 i [ p i ≥ p j ] − ∑ j = i + 1 n [ p i ≥ p j ] ) = ∑ i = 1 n i ( i − ∑ j = 1 n [ p i ≥ p j ] ) \begin{aligned} f(p)&=\sum_{i=1}^{n}i\left (i- \sum_{j=1}^{i}[p_i\ge p_j]-\sum_{j=i+1}^{n}[p_i\ge p_j] \right ) \\&=\sum_{i=1}^{n}i\left ( i-\sum_{j=1}^{n}[p_i\ge p_j] \right ) \end{aligned} f(p)=i=1∑ni(i−j=1∑i[pi≥pj]−j=i+1∑n[pi≥pj])=i=1∑ni(i−j=1∑n[pi≥pj])
给定我们的是一个排列,那这 ∑ j = 1 n [ p i ≥ p j ] \begin{aligned} \sum_{j=1}^{n}[p_i\ge p_j] \end{aligned} j=1∑n[pi≥pj] 实际上就是 i i i 的排名,那不就是 p i p_i pi了!
所以 f ( p ) = ∑ i = 1 n i ( i − p i ) \begin{aligned} f(p)&=\sum_{i=1}^{n}i\left ( i-p_i \right ) \end{aligned} f(p)=i=1∑ni(i−pi)。
于是式子变的可求,此时再考虑区间翻转。 i i i 在每一次翻转后的具体位置是不可直接计算的,所以我们只需要算出 i i i 在 m m m 次操作后到达位置的期望 E ( i ) E(i) E(i) 即可求的最终答案,即:
( C n + 1 2 ) m ∑ i = 1 n i 2 − p i × E ( i ) \begin{aligned} (C_{n+1}^{2})^m \sum_{i=1}^{n}i^2-p_i\times E(i) \end{aligned} (Cn+12)mi=1∑ni2−pi×E(i)
思考翻转的本质,设 i i i 被翻转并最终翻转到 j j j,那么翻转的中心显然是 i + j 2 \frac{i+j}{2} 2i+j。
若 i > j i>j i>j,则翻转的方案数为 ( j , n − i + 1 ) (j,n-i+1) (j,n−i+1)。
若 i < j i<j i<j,则翻转的方案数为 ( i , n − j + 1 ) (i,n-j+1) (i,n−j+1)。
试着把两种情况合并,发现最终方案数为 m i n ( i , n − i + 1 , j , n − j + 1 ) min(i,n-i+1,j,n-j+1) min(i,n−i+1,j,n−j+1)。
由此我们注意到从 i i i 翻转到 j j j,和从 i i i 翻转到 n − j + 1 n-j+1 n−j+1 的概率是相等的。所有位置总贡献就是 j + n − j + 1 2 = n + 1 2 \frac{j+n-j+1}{2}=\frac{n+1}{2} 2j+n−j+1=2n+1,最终期望为一个定值。
再考虑 i i i 在所有操作中都没被翻转的情况,它最终期望位置为 i i i,而都不被包含的概率又如何算?考虑一次操作中不被包含,则概率 q = 1 − i × ( n − i + 1 ) C n + 1 2 q=1-\frac{i\times (n-i+1)}{C_{n+1}^{2}} q=1−Cn+12i×(n−i+1)。它的含义是剔除掉所有区间翻转方案中翻转到 i i i 的概率。
所以最终 E ( i ) = q × i + ( 1 − q ) × n + 1 2 E(i)=q\times i+(1-q)\times \frac{n+1}{2} E(i)=q×i+(1−q)×2n+1。再将其代入上式即可得到答案,代码并不长,注意取模即可。
至此,我们终于解决此题。总结这道题对我们的启发:
①:对于一些有形如 [ p i > p j ] [p_i>p_j] [pi>pj] 等类似逆序对,顺序对的信息,我们考虑用上述方法简化此条件。一开始不是想如何求,而是想如何可求。
②:一些让我们计算最终位置的题型中,从对称等概率的关系去考虑,可能会挖掘出意想不到的性质。
简单贴一下代码。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10,mod=998244353;
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,p[N],s[N];
int qpow(int a,int b){int res=1;a%=mod;while(b){if(b&1)res=res*a%mod;a=a*a%mod,b>>=1;}return res;
}
signed main(){n=read(),m=read();int power=0,ep=(n+1)*qpow(2,mod-2)%mod;for(int i=1;i<=n;i++) p[i]=read(),(power+=i*i%mod)%=mod;for(int i=1;i<=n;i++){int tmp=((1-2*i*(n-i+1)%mod*qpow(n*(n+1),mod-2))+mod)%mod;int q=qpow(tmp,m);s[i]=(q*i%mod+((1-q+mod)%mod)*ep%mod)%mod;}int res=0,C=n*ep%mod;for(int i=1;i<=n;i++) (res+=s[i]*p[i]%mod)%=mod;int ans=(power-res+mod)%mod*qpow(C,m)%mod;cout<<ans<<endl;return 0;
}