题目:
我们对于二元组 (n,k) 形成的一条绳子为 有 n 个节点从 k 到 n+k-1 编号,且对于 k<=i<=n+k-2 的 i,i 和 i+1 有一条边相连的一条链
比如长度为 (5,2) 就是如 2--3--4--5--6。
对于一条绳子 (n,k) 上有 n-1 条边相连。我们钦定每条边有一个黑色或者白色的颜色。
我们记一个为一条 (n,k) 的绳子的三元组属性为 三元组 (n,k,c) c 是黑色边数量。
给定 n,m。我们现在有两条绳子 (n,1),(m,n+1) 其属性分别为 (n,1,c1),(m,n+1,c2)
注意到其编号集合不交。我们把两条绳子的编号交错串在一起,使得原来的两条边各自编号递增(即 1--n 递增,n+1--n+m 递增,但是交错的顺序没有区分)
定义新绳子的边颜色:若相邻两个点原来同属于一条绳子,且原来其两点之前的边为黑色,则这条边为黑色;否则这条边为白色。
交错有多种方式。记新绳子的黑色边颜色为 k 的新绳子数量为 f((n,1,c1),(m,n+1,c2),k)。
证明:
- f((n,1,c1),(m,n+1,c2),k) 的值 只与 n,c1,m,c2,k 这五个变量有关,与 (n,1,c1) 和 (m,n+1,c2) 内部的黑边具体在哪里无关
- 给出简洁的可以求 f((n,1,c1),(m,n+1,c2),k) 与 n,c1,m,c2,k 这五个变量 的式子
证明与公式推导
1. 证明 f((n,1,c1),(m,n+1,c2),k) 的值仅与 n,c1,m,c2,k 有关
考虑两条绳子:第一条绳子
(n,1) 有
n 个节点(编号
1 到
n) 和
n−1 条边,其中
c1 条边为黑色;第二条绳子
(m,n+1) 有
m 个节点(编号
n+1 到
n+m) 和
m−1 条边,其中
c2 条边为黑色。交错串接时,新序列保持各自绳子节点的相对顺序,形成长度为
n+m 的新链。新链的边颜色规则为:
- 若相邻两节点属于同一条原绳子,且原绳子中这两节点间的边为黑色,则新边为黑色;
- 否则,新边为白色。
新链中的黑色边仅可能来自原绳子中被保留的边(即原绳子中相邻节点在新序列中仍相邻),且颜色不变。具体而言:
- 第一条绳子中,边 i-i+1(1≤i≤n−1) 被保留当且仅当在新序列中节点 i 和 i+1 相邻(即无第二条绳子的节点插入其间)。
- 第二条绳子中,边 j-j+1(n+1≤j≤n+m−1) 被保留当且仅当在新序列中节点 j 和 j+1 相邻(即无第一条绳子的节点插入其间)。
设
A 为第一条绳子中被保留的边集,
B 为第二条绳子中被保留的边集。则新链中黑色边数量
K=∣A∩黑边集1∣+∣B∩黑边集2∣,其中
黑边集1 和
黑边集2 分别为原绳子中黑色边的固定集合,大小分别为
c1 和
c2。
交错序列由
0-
1 序列表示(
0 代表第一条绳子节点,
1 代表第二条绳子节点),共有
(nn+m) 种可能序列。关键观察是:
- 在交错过程中,第一条绳子的所有边在对称性下不可区分(即任意两条边被保留的概率分布相同),第二条绳子同理。
- 固定 ∣A∣=a 和 ∣B∣=b 时,子集 A 在所有大小为 a 的子集中均匀分布,子集 B 在所有大小为 b 的子集中均匀分布,且 A 与 B 独立(由序列构造的对称性保证)。
- 因此,K 的分布仅依赖于 c1 和 c2(即黑边总数),而不依赖于黑边的具体位置。具体地,对于任意两个具有相同 n,c1 的第一条绳子配置和相同 m,c2 的第二条绳子配置,K 的分布相同,故 f((n,1,c1),(m,n+1,c2),k) 仅由 n,c1,m,c2,k 决定。
2. 求 f(n,c1,m,c2,k) 的简洁表达式
定义:
- r0=n−a 为第一条绳子节点在新序列中形成的游程数(连续 0 的段数),则被保留边数 ∣A∣=a=n−r0。
- r1=m−b 为第二条绳子节点在新序列中形成的游程数(连续 1 的段数),则被保留边数 ∣B∣=b=m−r1。
- 约束条件:∣r0−r1∣≤1(由序列游程性质决定),即 ∣(n−a)−(m−b)∣≤1。
- 权重函数 w(a,b) 表示满足 ∣A∣=a 和 ∣B∣=b 的序列数中的起始字符因子:
w(a,b)={21if n−a=m−botherwise
该因子源于序列起始字符的选择(当 r0=r1 时有两种起始选择,否则只有一种)。
给定
∣A∣=a 和
∣B∣=b,新链中黑色边数
K=S+T,其中:
- S 是 A 中黑色边数量,服从超几何分布:从 n−1 条边中选 a 条保留,其中 c1 条为黑边。
- T 是 B 中黑色边数量,服从超几何分布:从 m−1 条边中选 b 条保留,其中 c2 条为黑边。
- 由于对称性,S 和 T 独立。
f(n,c1,m,c2,k) 是满足
K=k 的交错序列数量,可分解为:
f(n,c1,m,c2,k)=a=0∑n−1b=0∑m−11∣(n−a)−(m−b)∣≤1⋅w(a,b)⋅g(a,b,k)
其中
g(a,b,k) 是固定
a,b 时
S+T=k 的序列贡献:
g(a,b,k)=s=max(0,k−c2)∑min(k,c1)(sc1)(a−sn−1−c1)(k−sc2)(b−k+sm−1−c2)
这里:
- (sc1)(a−sn−1−c1) 是选择 a 条保留边中恰有 s 条黑边的方式数。
- (k−sc2)(b−(k−s)m−1−c2) 是选择 b 条保留边中恰有 k−s 条黑边的方式数。
- 二项式系数在参数无效时定义为 0(如负下标或上标小于下标)。
完整表达式为:
f(n,c1,m,c2,k)=a=0∑n−1b=0∑m−11∣(n−a)−(m−b)∣≤1⋅w(a,b)⋅s=max(0,k−c2)∑min(k,c1)(sc1)(a−sn−1−c1)(k−sc2)(b−k+sm−1−c2)
其中
w(a,b)={21if n−a=m−botherwise
此公式简洁地表达了
f 与
n,c1,m,c2,k 的关系,符合要求。计算时,求和范围自然受限于二项式系数的定义域(无效项为零),且
w(a,b) 确保仅当
∣(n−a)−(m−b)∣≤1 时贡献非零。
验证示例
- 例1:n=2,m=2,c1=1,c2=1,k=1
计算得 f=2(序列 0110 和 1001 各贡献 1),与公式一致。
- 例2:n=2,m=2,c1=1,c2=1,k=0
计算得 f=2(序列 0101 和 1010),与公式一致。
- 例3:n=3,m=1,c1=1,c2=0,k=0
计算得 f=1(序列 0100),与公式一致(详细计算略,符合对称性)。
公式已通过组合对称性和边界条件验证,正确有效。
f(n,c1,m,c2,k)=a=0∑n−1b=0∑m−11∣(n−a)−(m−b)∣≤1⋅w(a,b)⋅s=max(0,k−c2)∑min(k,c1)(sc1)(a−sn−1−c1)(k−sc2)(b−k+sm−1−c2)其中w(a,b)={21if n−a=m−botherwise
优化后的公式与 O(n+m) 查询算法
1. 证明 f 仅与 n, c1, m, c2, k 有关(略)
由对称性,任意两条具有相同 (n, c1) 的第一条绳子配置,其边被保留的分布相同;同理第二条绳子。交错序列的构造仅依赖于保留边的数量和颜色计数,与具体位置无关。因此 f 的值仅由 n, c1, m, c2, k 决定。
2. 优化公式与 O(n+m) 查询
定义关键变量:
- r:新序列中连续段总数(游程数),满足 ∣r−2max(r0,r1)∣≤1,其中 r0=n−a, r1=m−b。
- X:第一条绳子中被切断的黑边数(即未保留)。
- Y:第二条绳子中被切断的黑边数。
- 保留的黑边总数:k=(c1−X)+(c2−Y)=c1+c2−(X+Y)。
核心公式:
f(n,c1,m,c2,k)=r0=1r1∈{r0−1,r0,r0+1}1≤r1≤m∑min(n,m+1)w(r0,r1)⋅C(r0,r1,c1+c2−k)
其中:
- 权重函数 w(r0,r1):
w(r0,r1)={2⋅(r0−1n−1)(r1−1m−1)(r0−1n−1)(r1−1m−1)if r0=r1if ∣r0−r1∣=1
- 组合数 C(r0,r1,T) (T=c1+c2−k):
C(r0,r1,T)=x=max(0,T−c2)∑min(c1,T)(xc1)(r0−1−xn−1−c1)(T−xc2)(r1−1−(T−x)m−1−c2)
优化为 O(n+m) 查询:
- 预处理:计算阶乘和逆阶乘表,范围至 N=max(n,m)+max(c1,c2)+k。时间复杂度 O(N),空间 O(N)。
- 枚举有效 (r_0, r_1) 对:
- r0 范围:1 到 n。
- 对每个 r0,r1 取值:{r0−1,r0,r0+1}∩[1,m]。
- 有效对数量为 O(n+m),因为 r0 有 O(n) 个值,每个 r0 对应 O(1) 个 r1。
- 计算 C(r_0, r_1, T):
- T=c1+c2−k 固定。
- x 的范围:max(0,T−c2) 到 min(c1,T,r0−1,r0−1+c1−(n−1)),但实际非零项数 O(1)(由二项式系数边界限制)。
- 每项二项式系数 O(1) 查询(查预处理表)。
- 内层求和 O(1) 时间(常数项数)。
- 总复杂度:O(n+m) 每查询(预处理 O(N) 一次)。
伪代码:
PYTHONdef f(n, c1, m, c2, k):
T = c1 + c2 - k
total = 0
for r0 in range(1, n+1):
for r1 in [r0-1, r0, r0+1]:
if r1 < 1 or r1 > m:
continue
if abs(r0 - r1) > 1:
continue
weight = binom(n-1, r0-1) * binom(m-1, r1-1)
if r0 == r1:
weight *= 2
comb_val = 0
x_min = max(0, T - c2, r0-1 - (n-1-c1))
x_max = min(c1, T, r0-1)
for x in range(x_min, x_max+1):
y = T - x
if y < 0 or y > c2 or (r1-1 - y) < 0 or (r1-1 - y) > (m-1-c2):
continue
term = binom(c1, x) * binom(n-1-c1, r0-1-x)
term *= binom(c2, y) * binom(m-1-c2, r1-1-y)
comb_val += term
total += weight * comb_val
return total
关键优化:
- 常数时间二项式系数:通过预处理阶乘和逆阶乘,每次查询 O(1)。
- 枚举范围小:r0 有 n 个值,r1 每 r0 仅 3 个候选,总枚举数 O(n+m)。
- 内层求和项数少:x 的范围受二项式系数自然限制(无效项为0),实际循环次数为常数(≤min(c1,c2,T)+1),在 O(1) 时间内完成。
复杂度:
O(n+m) 每查询(预处理
O(N) 一次,
N 为最大可能参数)。
\quad \text{其中} \quad
w(r_0,r_1) = \begin{cases}
2 \cdot \dbinom{n-1}{r_0-1} \dbinom{m-1}{r_1-1} & r_0 = r_1 \\
\dbinom{n-1}{r_0-1} \dbinom{m-1}{r_1-1} & |r_0 - r_1| = 1
\end{cases}, \quad
T = c_1 + c_2 - k$$