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