CF1852A 中的结论证明
Foreword
今天比赛在 CF1852A 卡了很久,虽然最终没能想出官方题解中给出的逆向计算法,但是却意外地发掘出了一个有趣的性质,在这里给出其证明。
Preliminary
我们定义字符串 S(下标从 1 开始)拥有周期 k∈(0,∣S∣)∩Z 当且仅当 ∀i∈[1,∣S∣−k], S[i]=S[i+k]。记 per(S) 为 S 的最小周期。特别的,若 S 没有周期,则 per(S)=∣S∣。
记字符串的子串为 S[i,j]=S[i,j+1)=S(i−1.j]=S(i−1,j+1)。
Introduction
原题面的数学模型如下
给出一个长度为 n 的数组 {ai}⊂N 满足 0<a1<a2<..<an。定义 M(E,i) 为离散集合 E 中第 i 小的数,且 E0=N+,Ei=Ei−1−{ M(Ei−1,aj) : j∈[1,n]∩Z },求 minEk。
若 a1>1,则 minEk=1。在之后的讨论中,我们默认 a1=1。此外,出于一致性考虑,不妨令 an+1=+∞。
很显然,对于任意的 s∈N+,存在 us∈N,使得 s∈Eus 且 s∈/Eus+1。由定义,∃vs∈[1,n]∩Z s.t. M(Eus,avs)=s。由此可以定义这样一个无限长的字符串 T 满足 T[s]=vs。我们有以下结论
∀i∈[1,n]∩Z, per(T(ai−i,ai+1))=i.
以及
∀i∈[1,n]∩Z and j∈[1,i]∩Z, ∣{ T[k]=j : k∈(ai−i,ai]∩Z }∣=1.
即 T(ai−i,ai] 中每个字符只出现了一次。
例如,若我们令 1,2,3,.. 编码的字符为 a,b,c,..,对于 {ai}=<1,4>,T[1,30]=aaabababababababababababababab;对于 {ai}=<1,2,8,9,13,25>,T[1,30]=abababacdbacedbacedbacedfbaced。
Proof(Maybe)
我们尝试使用归纳证明的思想证明上述结论。首先,当 n=1 时这一结论显然成立。现在不妨假设 n=k−1 时结论成立,此时不难发现将 ak 加入到数组(此时 ak+1 变为 +∞)对于 T[1,ak) 没有影响。考虑到 per(T(ak−1−k+1,ak))=k−1,我们可以推得 T(ak−k,ak) 中每个字符只出现了一次,且这些字符在 [1,k−1] 之间。注意到 T[ak]=k,故 T(ak−k,ak] 中每个字符只出现了一次。
而注意到 ∀t∈N,Et+1 相较于 Et 少了 k 个数,第 ak 小的数也就往后顺延了 k 位(注意,此时 ak+1=∞,故而这 k 位都是连续的),故而 M(Et+1,ak)=M(Et,ak)+k,亦 T[ak]=T[ak+k]=T[ak+2k]=..=k。
接着考虑 k−1。不妨令 t′ 使得 M(Et′,ak−1)∈(ak−k,ak)。Et′+1 相较于 Et′ 少了 k−1 个数,其中小于等于 M(Et′,ak−1) 的有 k−1 个,故第 ak−1 小的数也就往后顺延了 k−1 位。但在往后顺延的过程中必然会遇到空位。不难证明,若 T[s]=ak,则 s∈/Et′;若 T[s]<ak−1,则 s∈Et′。结合 T[ak]=T[ak+k]=..=k 可知在往后顺延的过程中必然会跳过一位已经不在 Et′ 中的元素,故有 T[t′]=T[t′+(k−1)+1]=T[t′+k]=T[t′+2k]=..=k−1。同理我们也可以推出 T[t′′]=T[t′′+(k−2)+2]=T[t′′+k]=..=k−2,T[t′′′]=T[t′′′+(k−3)+3]=T[t′′′+k]=..=k−3,故而证明了周期性。
Afterword
这一结论除了可以帮助 O(n) 做出 CF1852A 外,似乎还有很多用途。我已经有了一个毒瘤的点子,可惜现在我困了,不想写了。晚安。