题解:AT_arc154_e [ARC154E] Reverse and Inversion

· · 题解

赛时唯一切这个题的人是通过做梦梦出来的。

记 $L_j=\sum\limits_{i<j}[p_i>p_j],R_i=\sum\limits_{i<j}[p_i>p_j]$,则 $f(p)=\sum\limits_{k=1}^n k (L_k-R_k)$。 考虑排列的特殊性,$k$ 左侧有 $k-1$ 个元素,其中有 $L_k$ 个比 $p_k$ 大,故有 $k-1-L_k$ 个比 $p_k$ 小,而右边有 $R_k$ 个比 $p_k$ 小,因此 $k-1-L_k+R_k=p_k-1$,即 $L_k-R_k=k-p_k$,因此 $f(p)=\sum\limits_{i=1}^n i(i-p_i)$。 我们不妨设 $e_i$ 表示 $p_i$ 经过操作后的期望位置,那么答案变为 $\sum\limits_{i=1}^n i^2-e_ip_i$,考虑怎么求 $e_i$。 当一个点 $i$ 被反转时,左端点的期望 $E(L)=\frac 1 i\sum\limits_{l=1}^i l=\frac{i+1} 2$,同理,$E(R)=\frac{i+n}{2}$。有趣的事情发生了,$E(R+L-i)=E(R)+E(L)-E(i)=\frac{i+1}2+\frac{i+n}{2}-i=\frac{n+1}{2}$。即只要 $i$ 经过反转,那么他的期望位置就是 $\frac{n+1}{2}$。 那么综合被选和不被选的情况考虑,$e_i=k_i^mi+(1-k_i^m)\frac{n+1}{2}$,其中 $k$ 表示 $i$ 不被选中的概率,$k_i=1-\frac{2i(n-i+1)}{n(n+1)}$。 然后算就可以了。 ``` #include<bits/stdc++.h> using namespace std; const int N=2e5+5,P=998244353; int qmi(int a,int b,int res=1){for(;b;b>>=1,a=1ll*a*a%P)if(b&1) res=1ll*res*a%P;return res;} int n,m,p[N],e[N],ans; int main(){ freopen("easy.in","r",stdin); freopen("easy.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>p[i]; int t=(-2ll*i*(n-i+1)%P*qmi(1ll*n*(n+1)%P,P-2)%P+P+1)%P;t=qmi(t,m); e[i]=(1ll*i*t%P+1ll*(1-t+P)%P*(n+1)%P*qmi(2,P-2)%P)%P; ans=(ans+1ll*i*i%P)%P,ans=(ans+P-1ll*e[i]*p[i]%P)%P; }return cout<<1ll*ans*qmi(1ll*n*(n+1)/2%P,m)%P,0; } ```