acm-(组合计数、好题、期望、推式子)IMO Harder Problem The 2019 ICPC Vietnam National Contest

题面
kattis传送门
vj传送门
本题非常考验数学推理能力,是一道非常不错的题目。先简化下题意:

设仅由 H,T \textrm{H,T} H,T两个字符组成的串 A \textrm{A} A中有 k k k H \textrm{H} H字符,然后我们可以进行一种操作,这种操作每次都会把 A [ k ] \textrm{A}[k] A[k]反转(即原来是 H \textrm{H} H反转后变成 T \textrm{T} T,原来是 T \textrm{T} T反转后则变成 H \textrm{H} H)。现在如果我们一直重复这样的操作那么最终串 A \textrm{A} A中的字符会全变成 T \textrm{T} T(可以被证明,可以手算几个样例很容看出来),假设需要操作 L ( A ) L(\textrm{A}) L(A)次恰好将 A \textrm{A} A的字符变成全为 T \textrm{T} T
现在的问题如下:假设字符串 S \textrm{S} S H,T,? \textrm{H,T,?} H,T,?三种字符组成,其中 ? \textrm{?} ? M M M个, ? \textrm{?} ?号可以变成 H \textrm{H} H T \textrm{T} T字符,这样 S \textrm{S} S可以变成 2 M 2^M 2M种仅含 H \textrm{H} H T \textrm{T} T的字符串,问你这些串对应的 L L L的平均值是多少。

先考虑对于仅含 H,T \textrm{H,T} H,T字符的 S \textrm{S} S串如何计算 L ( S ) L(\textrm{S}) L(S)

先给出结论: L ( S ) = 2 ( a [ 1 ] + a [ 2 ] + a [ 3 ] + . . . + a [ k ∣ ] ) − k 2 L(\textrm{S})=2(a[1]+a[2]+a[3]+...+a[k|])-k^2 L(S)=2(a[1]+a[2]+a[3]+...+a[k])k2,其中 a [ i ] a[i] a[i]表示 S \textrm{S} S第串中 i i i H \textrm{H} H字符的位置(从1开始编号), k k k表示 S \textrm{S} S串中的 H \textrm{H} H字符数量

证明:假设 l ≥ k l\ge k lk l l l是最小的使得 S [ l ] = H \textrm{S}[l]=\textrm{H} S[l]=H成立的位置。不难理解 l l l是一定存在的,我们现在将这两个位置标记出来,如下面所示(下标代表在 S \textrm{S} S串中的位置):
T k T k + 1 T k + 2 . . . . T l − 2 T l − 1 H l \textrm{T}_k\textrm{T}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{H}_l TkTk+1Tk+2....Tl2Tl1Hl
注意可能有 l = k l=k l=k的情况出现,此时有 H k = l \textrm{H} _{k=l} Hk=l
我们现在模拟一下操作的流程
第 0 次 操 作 :             T k T k + 1 T k + 2 . . . . T l − 2 T l − 1 H l 第0次操作:\quad\,\quad\quad\;\;\;\;\,\textrm{T}_k\textrm{T}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{H}_l 0TkTk+1Tk+2....Tl2Tl1Hl
第 1 次 操 作 :             H k T k + 1 T k + 2 . . . . T l − 2 T l − 1 H l 第1次操作:\quad\,\quad\quad\;\;\;\;\,\textrm{H}_k\textrm{T}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{H}_l 1HkTk+1Tk+2....Tl2Tl1Hl
第 2 次 操 作 :             H k H k + 1 T k + 2 . . . . T l − 2 T l − 1 H l 第2次操作:\quad\,\quad\quad\;\;\;\;\,\textrm{H}_k\textrm{H}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{H}_l 2HkHk+1Tk+2....Tl2Tl1Hl
⋯ \cdots
第 l − k 次 操 作 :         H k H k + 1 H k + 2 . . . . H l − 2 H l − 1 H l 第l-k次操作:\quad\,\quad\;\;\,\textrm{H}_k\textrm{H}_{k+1}\textrm{H}_{k+2} ....\textrm{H}_{l-2}\textrm{H}_{l-1}\textrm{H}_l lkHkHk+1Hk+2....Hl2Hl1Hl
第 l − k + 1 次 操 作 :   H k H k + 1 H k + 2 . . . . H l − 2 H l − 1 T l 第l-k+1次操作:\quad\,\textrm{H}_k\textrm{H}_{k+1}\textrm{H}_{k+2} ....\textrm{H}_{l-2}\textrm{H}_{l-1}\textrm{T}_l lk+1HkHk+1Hk+2....Hl2Hl1Tl
第 l − k + 2 次 操 作 :   H k H k + 1 H k + 2 . . . . H l − 2 T l − 1 T l 第l-k+2次操作:\quad\,\textrm{H}_k\textrm{H}_{k+1}\textrm{H}_{k+2} ....\textrm{H}_{l-2}\textrm{T}_{l-1}\textrm{T}_l lk+2HkHk+1Hk+2....Hl2Tl1Tl
第 l − k + 3 次 操 作 :   H k H k + 1 H k + 2 . . . . T l − 2 T l − 1 T l 第l-k+3次操作:\quad\,\textrm{H}_k\textrm{H}_{k+1}\textrm{H}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{T}_l lk+3HkHk+1Hk+2....Tl2Tl1Tl
⋯ \cdots
第 2 ( l − k ) 次 操 作 :       H k T k + 1 T k + 2 . . . . T l − 2 T l − 1 T l 第2(l-k)次操作:\quad\;\;\,\textrm{H}_k\textrm{T}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{T}_l 2(lk)HkTk+1Tk+2....Tl2Tl1Tl
第 2 ( l − k ) + 1 次 操 作 : T k T k + 1 T k + 2 . . . . T l − 2 T l − 1 T l 第2(l-k)+1次操作:\textrm{T}_k\textrm{T}_{k+1}\textrm{T}_{k+2} ....\textrm{T}_{l-2}\textrm{T}_{l-1}\textrm{T}_l 2(lk)+1TkTk+1Tk+2....Tl2Tl1Tl
因此我们用了 2 ( l − k ) + 1 2(l-k)+1 2(lk)+1次操作让字符串 S \textrm{S} S k 到 l k到l kl段完全被 T \textrm{T} T字符所覆盖,并且我们成功让一个 H \textrm{H} H字符从串 S \textrm{S} S中消失,如果我们继续操作,会发现当前的 H \textrm{H} H字符的数量变成了 k ′ = k − 1 k'=k-1 k=k1,然后我们考虑 l ′ ≥ k ′ l'\ge k' lk满足 l ′ l' l是最小的使得 S [ l ′ ] = H \textrm{S}[l']=\textrm{H} S[l]=H成立的位置,同样地,如果我们想让 l ′ l' l处的 H \textrm{H} H字符消失的话就需要花费 2 ( l ′ − k ′ ) + 1 2(l'-k')+1 2(lk)+1次操作,以此类推…
我们发现每一轮都会使得 k k k减一,也就是 H \textrm{H} H字符减少一个,那么势必最终 S \textrm{S} S串中的 H \textrm{H} H字符将完全消失,也就达到了我们的目的,这也顺便证明了这种操作一定是有限的。
在第一轮中我们会操作 2 ( l − k ) + 1 2(l-k)+1 2(lk)+1次,第二轮中我们会操作 2 ( l ′ − ( k − 1 ) + 1 2(l'-(k-1)+1 2(l(k1)+1,第三轮中我们会操作 2 ( l ′ ′ − ( k − 2 ) ) + 1 2(l''-(k-2))+1 2(l(k2))+1,最终 k k k会减成0,将这些操作次数加起来就能得到 2 ( l + l ′ + l ′ ′ + . . . ) − 2 ( k + ( k − 1 ) + ( k − 2 ) + . . . + 1 ) + k = 2 ( l + l ′ + l ′ ′ + . . . ) − k 2 2(l+l'+l''+...)-2(k+(k-1)+(k-2)+...+1)+k=2(l+l'+l''+...)-k^2 2(l+l+l+...)2(k+(k1)+(k2)+...+1)+k=2(l+l+l+...)k2,然后注意到这些 l , l ′ , l ′ ′ . . . l,l',l''... l,l,l...其实就是 S \textrm{S} S串初始时候各个 H \textrm{H} H字符的位置,这是因为我们每一轮操作都没有增加 H \textrm{H} H字符,并且也没有将 S \textrm{S} S串中除 l l l位置以外的 H \textrm{H} H消除,故我们每次都是再消除 S \textrm{S} S串初始时候的那些 H \textrm{H} H字符,故 l ′ + l ′ ′ + l ′ ′ ′ + . . . = a [ 1 ] + a [ 2 ] + . . . + a [ k ] l'+l''+l'''+...=a[1]+a[2]+...+a[k] l+l+l+...=a[1]+a[2]+...+a[k],于是我们证明了结论是正确的。

现在我们将本题的答案分为两部分来解决:

  1. s u m = 2 ( a [ 1 ] + a [ 2 ] + . . . + a [ k ] ) sum=2(a[1]+a[2]+...+a[k]) sum=2(a[1]+a[2]+...+a[k])
    我们想要求出 s u m sum sum的期望,不妨改写一下这个式子,显然这个式子等价于 s u m = 2 ( 1 ⋅ [ S [ 1 ] = H ] + 2 ⋅ [ S [ 2 ] = H ] + . . . + n [ S [ n ] = H ] ) sum=2(1\cdot [\textrm{S}[1]=\textrm{H}]+2\cdot [\textrm{S}[2]=\textrm{H}]+...+n[\textrm{S}[n]=\textrm{H}]) sum=2(1[S[1]=H]+2[S[2]=H]+...+n[S[n]=H]),于是考虑第 i i i个位置上的 [ S [ i ] = H ] [\textrm{S}[i]=\textrm{H}] [S[i]=H]的期望是多少,这里分三种情况讨论:

    1. S [ i ] = H \textrm{S}[i]=\textrm{H} S[i]=H:显然期望是1
    2. S [ i ] = T \textrm{S}[i]=\textrm{T} S[i]=T:显然期望是0
    3. S [ i ] = ? \textrm{S}[i]=\textrm{?} S[i]=?:显然期望是 1 2 \frac 12 21

    这样不难得到 E ( s u m ) = ∑ i = 1 ∣ S ∣ i ( { 0 i f    S [ i ] = T 1 i f    S [ i ] = ? 2 i f    S [ i ] = H ) E(sum)=\sum_{i=1}^{|\textrm{S}|}i(\begin{cases}0&if\;\textrm{S}[i]=\textrm{T}\\1&if\;\textrm{S}[i]=\textrm{?}\\2&if\;\textrm{S}[i]=\textrm{H}\end{cases}) E(sum)=i=1Si(012ifS[i]=TifS[i]=?ifS[i]=H)

  2. k 2 k^2 k2
    我们想求出 k 2 k^2 k2的期望,不妨考虑将所有可能的串的 k 2 k^2 k2加起来( ∑ k 2 \sum k^2 k2)然后除以串的总数( 2 ? 的 数 量 2^{?的数量} 2?)即可,于是我们要计算 ∑ k 2 2 ? 的 数 量 \frac{\sum k^2}{2^{?的数量}} 2?k2,那么如何计算 ∑ k 2 \sum k^2 k2,考虑组合计数,我们枚举串中有多少个 ? \textrm{?} ?变成 H \textrm{H} H,假设个数为 i i i,那么计算这样的串有多少种,求和即可。
    假设 S \textrm{S} S串中有 n ? n_{?} n? ? \textrm{?} ? n H n_{H} nH H \textrm{H} H,于是能够得到 ∑ i = 0 n ? C n ? i ( n H + i ) 2 \sum_{i=0}^{n_{?}}C_{n_{?}}^i(n_{H}+i)^2 i=0n?Cn?i(nH+i)2,这个式子做展开能够得到 n H 2 ∑ i = 0 n ? C n ? i + 2 n H ∑ i = 0 n ? i C n ? i + ∑ i = 0 n ? i 2 C n ? i = n H 2 2 n ? + 2 n H n ? 2 n ? − 1 + n ? ( n ? + 1 ) 2 n ? − 2 n_H^2\sum_{i=0}^{n_?}C_{n_?}^i+2n_H\sum_{i=0}^{n_?}iC_{n_?}^i+\sum_{i=0}^{n_?}i^2C_{n_?}^i=n_{H}^22^{n_?}+2n_{H}n_?2^{n_?-1}+n_?(n_?+1)2^{n_?-2} nH2i=0n?Cn?i+2nHi=0n?iCn?i+i=0n?i2Cn?i=nH22n?+2nHn?2n?1+n?(n?+1)2n?2,于是我们知道 ∑ k 2 2 n ? = n H 2 + n H n ? + n ? ( n ? + 1 ) 4 \frac{\sum k^2}{2^{n_?}}=n_H^2+n_Hn_?+\frac {n_?(n_?+1)}4 2n?k2=nH2+nHn?+4n?(n?+1),这个式子可以直接求。

综上所述,我们通过将式子分成两部分用不同的方法把期望求出然后再将两部分相减即是最终的答案。

char s[maxn];
int main(){
	register int n=rd(s+1),n1=0,n2=0;
	register ll ans=0;
	FOR(i,1,n+1){
		if(s[i]=='H'){
			ans+=i+i;
			n1++;
		}else if(s[i]=='?'){
			ans+=i;
			n2++;
		}
	}
	ans-=1ll*n1*n1+1ll*n1*n2;
	wrn(ans-1ll*n2*(n2+1)/4.0);
} 

本题还可以扩展一下,假设串长为 n n n,且全是 ? \textrm{?} ?,那么期望是多少?显然可以用前面的结论直接求出答案,不过这里还有一种巧妙的方法来解决这个问题,我们考虑每次操作会出现一个数字改变,而且这种改变往往具有交替性,随便举个例子,比如 11011 11011 11011,它的操作变更情况如下所示:
11011 11011 11011
11001 11001 11001
11101 11101 11101
11111 11111 11111
11110 11110 11110
11100 11100 11100
11000 11000 11000
10000 10000 10000
00000 00000 00000
我们观察上述序列,先是一次操作使得1变成0,然后是连续的2次操作使0变成1,最后是连续的5次操作使1变成0。我们将操作次数写成一个集合得到 { 5 , 2 , 1 } \{5,2,1\} {5,2,1},显然对于任何一个确定的串(即不含 ? ? ?)我们都能够给出一个确定的集合,这相当于定义了一个串 S S S到集合的映射关系,我们设这个集合是 ϕ ( S ) \phi(S) ϕ(S),它代表了串 S S S到集合 ϕ ( S ) \phi(S) ϕ(S)的一个映射,容易证明这是一个单射。
然后考虑集合 1 , 2 , 3 , . . . , n {1,2,3,...,n} 1,2,3,...,n的任意子集 S ′ S' S,定义函数 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)为从 S ′ S' S到某个长度为 n n n的01串的映射,满足 S ′ S' S恰好是串 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)的操作次数构成的集合,这个串 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)是按如下方式产生的:
假设 S ′ = { a 1 , a 2 , . . . , a k } , ( a 1 > a 2 > . . . > a k ) S'=\{a_1,a_2,...,a_k\},(a_1>a_2>...>a_k) S={a1,a2,...,ak}(a1>a2>...>ak),先令串 s 0 s_{0} s0 00...0 ( n 个 0 ) 00...0(n个0) 00...0(n0),我们从 i = 1 i=1 i=1开始到 k k k s 0 s_0 s0进行 k k k轮操作来得到 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)串。
第1轮,我们花费 a 1 a_1 a1次操作将1~ a 1 a_1 a1位置的数置为1。
第2轮,我们花费 a 2 a_2 a2次操作将 a 1 − a 2 a_1-a_2 a1a2 a 1 − 1 a_1-1 a11位置的数置为0。
第3轮,我们花费 a 3 a_3 a3次操作将 a 1 − a 2 + 1 a_1-a_2+1 a1a2+1 a 1 − a 2 + a 3 a_1-a_2+a_3 a1a2+a3位置的数置为1。

最终我们能够得到 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)串,并且容易验证 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)的操作集合恰好也是 S ′ S' S,而且恰好 ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)也是单射。

于是通过 ϕ ( S ) \phi(S) ϕ(S) ϕ − 1 ( S ′ ) \phi^{-1}(S') ϕ1(S)我们建立了操作次数集合与01串之间相互映射的关系,更确切的来说,我们建立了集合 { 1 , 2 , 3 , . . . , n } \{1,2,3,...,n\} {1,2,3,...,n}的幂集(即集合 { 1 , 2 , 3 , . . . , n } \{1,2,3,...,n\} {1,2,3,...,n}的子集构成的集合)的元素与所有长度为 n n n的01串组成的集合的元素的映射关系,由于两个都是单射,因此它们的映射是一个一一映射,即满足两个集合的势相等。

并且根据 S ′ S' S集合的实际意义我们知道它的所有元素的和就是串 L ( S ) L(S) L(S)的值,那么根据一一映射我们可以进一步得知长度为 n n n的01串的 L L L的期望就是集合 { 1 , 2 , 3 , . . . , n } \{1,2,3,...,n\} {1,2,3,...,n}的子集元素和的期望。

集合 { 1 , 2 , 3 , . . . , n } \{1,2,3,...,n\} {1,2,3,...,n}的子集元素和的期望也就很好算了,考虑每个元素只有取与不取两种状态,这意味着元素 i i i对总期望的贡献为 i 2 \frac i2 2i,于是总期望为 1 2 ( 1 + 2 + 3 + . . . + n ) = n ( n + 1 ) 4 \frac 12(1+2+3+...+n)=\frac {n(n+1)}4 21(1+2+3+...+n)=4n(n+1)

于是我们说长度为 n n n的01串的 L L L值的期望为 n ( n + 1 ) 4 \frac {n(n+1)}4 4n(n+1),是不是非常巧妙呢!

注意这个证明并不完整,有关为什么 S S S S ′ S' S之间是一一对应的关系的证明还需要严谨地推敲,不过并不是很难想,如果实在想不明白这里可以参考下面英文版的详细完整版的证明:
英文版证明第一页
英文版证明第二页
英文版证明第三页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值