可以证明,n>2 时答案一定只和 i=1∑nai,i=1∑nai2 有关。下面给出上述结论的证明:
::::success证明
:::success结论
E[x2] 一定是关于 a1,a2,…,an 的二次式。
:::
:::success[证明]
操作形如选择两个数 a,b,把这两个数删除然后再加入 a−b 这个元素。因为这是一个线性操作,因此 x 一定是 a1,a2,…,an 的一个线性组合。
因此 x2 是关于 a1,a2,…,an 的二次式,根据期望的线性性可知 E[x2] 同样也是二次式。
:::
因此考虑把 E[x2] 用二次式的形式表示出来,即 i=1∑nαiAi2+i=1∑nj=1∑n[i=j]βi,jAiAj。
但是注意到 E[x2] 的值不能因为交换 A 数组中的两个位置就导致其值发生变化,因此必须有:α1=α2=…=αn,β1,2=β1,3=β1,4=…=βn,n−1。也即 E[x2] 可以表示为 αi=1∑nAi2+βi=1∑nj=1∑n[i=j]AiAj。
此时记 s1=i=1∑nAi,s2=i=1∑nAi2
,把上式所有含 A 的项都用 s1,s2 表示,得到:E[x2]=αs2+β(s12−s2)。
::::
此时可以直接写个暴力然后把 α,β 的值打表求出来,下面给出一个正常推导的做法。
先给数组 A 代入特值,令 A1=A2=…=An−1=0,An=t,则显然有 E[x2]=t2,s1=t,s2=t2,代入前面给出的式子得到 E[x2]=t2=αt2,因此必然有 α=1。
考虑记 bi 表示 n=i 时上式 β 的值,则 E[x2]=s2+bn(s12−s2)。此时考虑若在某次操作中选择了 i,j 两个位置,s2 的值会减少 2AiAj。因为 E[AiAj]=n(n−1)s12−s2,所以有 E[s2]=s2−n(n−1)2(s12−s2)。
s12−s2 的值会增加 2AiAj+4Aj2−4Ajs1,对其每项分别计算期望,得到:E[Aj]=ns1,E[Aj2]=ns2,E[AiAj]=n(n−1)s12−s2,因此有 E[s12−s2]=s12−s2−4s1×ns1+4×ns2+n(n−1)2(s12−s2),化简可得 E[s12−s2]=n(n−1)(n−2)(n−3)(s12−s2)。
记 fn(A) 为长度为 n 的 A 序列最后得到 x2 的期望值,则有 f1(A)=A12,f2(A)=(A1−A2)2,fn(A)=E[fn−1(A′)],其中 A′ 是 A 序列进行一次操作后得到的序列,把 E[x2] 代入上式可得 fn(A)=E[s2+bn−1(s12−s2)]=s2−n(n−1)2(s12−s2)+bn−1n(n−1)(n−2)(n−3)(s12−s2)。又因为 fn(A)=s2+bn(s12−s2),联立两个 fn(A) 的关系式可得 bn=−n(n−1)2+n(n−1)(n−2)(n−3)bn−1。线性求出前缀的逆元然后模拟上述过程可以做到 O(n) 求解答案。
:::success[能不能 O(1) 求出 bn 的值?]
先观察样例可以发现答案形如 32 加上一个数,然后再结合暴力打表,可以猜想 n≥3 时有 bn=−3(n−1)2,然后简单数学归纳证明即可。
:::
:::warning[注意]
特判 n≤2 的时候一定要记得给答案平方!!!
:::
代码实现。
喜欢的话,留下你的评论吧~