H. Eat Cards, Have Fun 考虑如何计算某个特定排列
A
的 Value.
Value(A)=∑i=1n(n−i)!∑j>i[Aj<Ai]
这启发我们对于每个
i
分别计算贡献。考虑当第
i
张卡片被吃掉的时候,我们需要知道这张卡片左边、右边分别已有多少卡片被吃掉(记为
l,r
),才能确定第
i
张卡片在
A
中的位置;我们还需要知道这张卡片左边、右边分别已有多少卡面数字小于
ai
的卡片被吃掉(记为
l^,r^
),才能确定第
i
张卡片对答案的贡献,即
∑j>i[Aj<Ai]
。如果知道了
l,r,l^,r^
,那么答案就是
Ans=∑i=1n∑l=0i−1∑r=0n−i∑l^=0l∑r^=0r(n−l−r−1)!(ai−1−l^−r^)P(i,l,r,l^,r^)
其中
P(i,l,r,l^,r^)
是达到对应情况的概率。我们可以枚举第
i
张卡片是在第
k
轮
(k>0)
被吃掉的来计算概率:
P(i,l,r,l^,r^)=(bil^)(i−bi−1l−l^)(ai−bi−1r^)(n−i−ai+bi+1r−r^)∑k=1∞(1−(1−p)k)l((1−p)k)i−1−lp(1−p)k−1(1−(1−p)k−1)r((1−p)k−1)n−i−r
其中
bi=∑j<i[aj<ai]
. 观察式子
(1−(1−p)x)y
,可以用二项式定理展开:
(1−(1−p)x)y=∑i=0y(yi)(−1)i(1−p)xi
利用上述结论,进一步化简:
====∑k=1∞(1−(1−p)k)l((1−p)k)i−1−lp(1−p)k−1(1−(1−p)k−1)r((1−p)k−1)n−i−rp∑k=1∞(1−p)k(i−1−l)+k−1+(k−1)(n−i−r)∑x=0l(lx)(−1)x(1−p)xk∑y=0r(ry)(−1)y(1−p)y(k−1)p∑x=0l∑y=0r(−1)x+y(lx)(ry)∑k=1∞(1−p)k(i−1−l)+k−1+(k−1)(n−i−r)+xk+y(k−1)p∑x=0l∑y=0r(−1)x+y(lx)(ry)∑k=0∞(1−p)k(n−l−r+x+y)+(i−1−l+x)p∑x=0l∑y=0r(−1)x+y(lx)(ry)(1−p)i−1−l+x1−(1−p)n−l−r+x+y
至此,我们获得了一个时间复杂度为
O(n5)
的算法。上述公式显然有不少冗余,可以进一步优化。 回顾原式:
Ans=p∑i=1n∑l=0i−1∑r=0n−i(n−l−r−1)!(∑x=0l∑y=0r(−1)x+y(lx)(ry)(1−p)i−1−l+x1−(1−p)n−l−r+x+y)(∑l^=0l∑r^=0r(ai−1−l^−r^)(bil^)(i−bi−1l−l^)(ai−bi−1r^)(n−i−ai+bi+1r−r^))
以下将定义若干辅助函数加速计算答案。 * 定义
F
:
F(i,l,r)=∑x=0l∑y=0r(−1)x+y(lx)(ry)(1−p)i−1−l+x1−(1−p)n−l−r+x+y
考虑如何快速计算
F
。不妨定义
Fn
:
Fn(l,r)=∑x=0l∑y=0r(−1)x+y(lx)(ry)(1−p)n−1−l+x1−(1−p)n−l−r+x+y
显然
F(i,l,r)=Fn(l,r)(1−p)i−n
。
Fn(l,r)=l!r!∑x=0l∑y=0r(−1)xx!(−1)yy!(1−p)n−1−(l−x)(l−x)!(r−y)!(1−(1−p)n−(l−x)−(r−y))
令
G(x,y)=(1−p)n−1−xx!y!(1−(1−p)n−x−y)
:
Fn(l,r)=l!r!∑x=0l(−1)xx!∑y=0r(−1)yy!G(l−x,r−y)
可以在
O(n3)
的时间计算出
Fn
。 定义
L,R,L+,R+,H
:
L(i,l)=∑l^=0l(bil^)(i−bi−1l−l^),R(i,r)=∑r^=0r(ai−bi−1r^)(n−i−ai+bi+1r−r^)
L+(i,l)=∑l^=0ll^(bil^)(i−bi−1l−l^),R+(i,r)=∑r^=0rr^(ai−bi−1r^)(n−i−ai+bi+1r−r^)
H(i,l,r)=∑l^=0l∑r^=0r(ai−1−l^−r^)(bil^)(i−bi−1l−l^)(ai−bi−1r^)(n−i−ai+bi+1r−r^)=(ai−1)L(i,l)R(i,r)−L+(i,l)R(i,r)−L(i,l)R+(i,r)
以
O(n3)
的代价预处理
L,R,L+,R+
, 可以在
O(n3)
的时间计算出
H
。 ** 现在
Ans
就可以在
O(n3)
的时间计算出来啦。
Ans=p∑i=1n∑l=0i−1∑r=0n−i(n−l−r−1)!Fn(l,r)(1−p)i−nH(i,l,r)