题目大意
给出一个整数 N N N和一段程序(包括三个函数):
- SUBSEQUENCE( A r r a y ) \text{SUBSEQUENCE(}Array\text) SUBSEQUENCE(Array):随机返回 A r r a y Array Array的一个子序列(可为空)。
- CNT-INVERSION-PAIRS( A r r a y ) \text{CNT-INVERSION-PAIRS(}Array\text) CNT-INVERSION-PAIRS(Array):返回 A r r a y Array Array的逆序对数。
- CALCULATE( A r r a y ) \text{CALCULATE(}Array\text) CALCULATE(Array):若 A r r a y Array Array为空,返回 0 0 0;否则返回 CNT-INVERSION-PAIRS( A r r a y ) + CALCULATE(SUBSEQUENCE( A r r a y )) \text{CNT-INVERSION-PAIRS(}Array\text)+\text{CALCULATE(SUBSEQUENCE(}Array\text{))} CNT-INVERSION-PAIRS(Array)+CALCULATE(SUBSEQUENCE(Array))。
先随机生成一个整数
n
∈
[
1
,
N
]
n\in[1,N]
n∈[1,N],再随机生成一个长度为
n
n
n的排列,求这个排列的
CALCULATE()
\text{CALCULATE()}
CALCULATE()函数的期望值。
有多组测试数据,每组数据
N
⩽
3000
N\leqslant 3000
N⩽3000。
思路
先求出长度为 n n n的排列的 CNT-INVERSION-PAIRS() \text{CNT-INVERSION-PAIRS()} CNT-INVERSION-PAIRS()函数的期望值,有两种思路:
思路1: 长度为
n
n
n的排列中一共有
C
n
2
C_n^2
Cn2对数对,每一对逆序的概率为
1
2
\frac 12
21,累加起来就是
C
n
2
2
=
n
!
2
(
2
!
)
(
n
−
2
)
!
=
n
(
n
−
1
)
4
\frac{C_n^2}2=\frac{n!}{2(2!)(n-2)!}=\frac{n(n-1)}4
2Cn2=2(2!)(n−2)!n!=4n(n−1)
思路2: 设该期望值对应的状态为
d
p
1
[
n
]
dp_1[n]
dp1[n],显然
d
p
1
[
1
]
=
0
dp_1[1]=0
dp1[1]=0,
d
p
1
[
2
]
=
1
2
dp_1[2]=\frac 12
dp1[2]=21。考虑将数字
n
n
n插入
1
1
1到
n
−
1
n-1
n−1的排列中,一共有
n
n
n个位置可插入,增加的逆序对数分别为
0
,
1
,
2
,
…
,
n
−
1
0,1,2,\dots,n-1
0,1,2,…,n−1,于是得到
d
p
1
[
n
]
=
d
p
1
[
n
−
1
]
+
0
+
1
+
2
+
⋯
+
(
n
−
1
)
n
=
d
p
1
[
n
−
1
]
+
n
−
1
2
d
p
1
[
n
]
=
n
(
n
−
1
)
4
\begin{aligned} dp_1[n]&=dp_1[n-1]+\frac{0+1+2+\cdots+(n-1)}n\\ &=dp_1[n-1]+\frac{n-1}2\\ dp_1[n]&=\frac{n(n-1)}4 \end{aligned}
dp1[n]dp1[n]=dp1[n−1]+n0+1+2+⋯+(n−1)=dp1[n−1]+2n−1=4n(n−1)
再求长度为
n
n
n的排列的
CALCULATE()
\text{CALCULATE()}
CALCULATE()函数的期望值。设该期望值对应的状态为
d
p
2
[
n
]
dp_2[n]
dp2[n],其中
d
p
2
[
1
]
=
0
dp_2[1]=0
dp2[1]=0。由题意不难得到
d
p
2
[
n
]
=
d
p
1
[
n
]
+
∑
i
=
0
n
C
n
i
⋅
d
p
2
[
i
]
∑
i
=
0
n
C
n
i
=
n
(
n
−
1
)
4
+
∑
i
=
0
n
−
1
C
n
i
⋅
d
p
2
[
i
]
2
n
+
d
p
2
[
n
]
2
n
d
p
2
[
n
]
=
2
n
−
2
n
(
n
−
1
)
+
∑
i
=
0
n
−
1
C
n
i
⋅
d
p
2
[
i
]
2
n
−
1
\begin{aligned} dp_2[n]&=dp_1[n]+\frac{\sum_{i=0}^nC_n^i\cdot dp_2[i]}{\sum_{i=0}^nC_n^i}\\ &=\frac{n(n-1)}4+\frac{\sum_{i=0}^{n-1}C_n^i\cdot dp_2[i]}{2^n}+\frac{dp_2[n]}{2^n}\\ dp_2[n]&=\frac{2^{n-2}n(n-1)+\sum_{i=0}^{n-1}C_n^i\cdot dp_2[i]}{2^n-1} \end{aligned}
dp2[n]dp2[n]=dp1[n]+∑i=0nCni∑i=0nCni⋅dp2[i]=4n(n−1)+2n∑i=0n−1Cni⋅dp2[i]+2ndp2[n]=2n−12n−2n(n−1)+∑i=0n−1Cni⋅dp2[i]
于是可以递推求出
d
p
2
[
n
]
dp_2[n]
dp2[n],时间复杂度
O
(
n
2
)
O(n^2)
O(n2)。
计算出
d
p
2
[
n
]
dp_2[n]
dp2[n]后,由于
n
∈
[
1
,
N
]
n\in[1,N]
n∈[1,N],显然
a
n
s
=
∑
n
=
1
N
d
p
2
[
n
]
N
ans=\frac{\sum_{n=1}^Ndp_2[n]}N
ans=N∑n=1Ndp2[n]
预处理 d p 2 [ n ] dp_2[n] dp2[n]的前缀和后就可以 O ( log 2 n ) O(\log_2n) O(log2n)求解。如果预处理了 N N N的逆元,求解可以达到 O ( 1 ) O(1) O(1)。