对于这样的题,先不要绕到具体操作里出不来。我们先把复杂的式子进行变形。
对于题中式子,先不考虑翻转,设
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;
}
2649

被折叠的 条评论
为什么被折叠?



