嗯……要做这题首先要会一个十分有趣但其实又略带几分显然的容斥: max(S)=∑T⊆S(−1)|T|+1min(S)min(S)=∑T⊆S(−1)|T|+1max(S)
证明挺简单的,这里只证第一条。
对于排名为 |S|−k 的元素,考虑构造一个容斥系数 f(|T|) 使得 [k=0]=k∑i=0(ki)f(i+1)
二项式反演得 f(k+1)=k∑i=0(−1)k−i(ki)[i=0]=(−1)kf(k)=(−1)k+1
证毕。
好玩的是这个玩意对期望也有用,所以就可以用来做这道题。
考虑把题目中给的「按位或」和「二进制数」看做集合操作,min(S)/max(S) 分别表示 S 集合内第一个 / 最后一个变为 1 的步数。
则我们要求的就是 E(max(U))=∑T⊆U(−1)|T|+1E(min(T)) 其中 U={i∣0≤i<n}。
于是现在就是要求 E(min(S))。
考虑 P(min(S)=i),这意味着前 i 秒选择的集合都与 S 不相交,而第 i 秒选择的集合与 S 相交。
即 P(min(S)=i)=(∑S∩T=∅pT)i(1−∑S∩T=∅pT)
设 w=∑S∩T=∅pT,则 E(min(S))=∞∑i=1iwi−1(1−w)=(1−w)∞∑i=1iwi−1(1−w)E(min(S))=(1−w)∞∑i=1iwi−1−(1−w)∞∑i=1(i−1)wi−1=(1−w)∞∑i=1wi−1E(min(S))=∞∑i=1wi=11−w
那么注意到 w=∑S∩T=∅pT=∑T⊆∁USpT,拿 FWT / FMT 求个卷积就行了。
代码:
1 |
|