杨表
杨氏矩阵(Young Tableau),又称杨表,是一类每行长度严格不降的表格,大小为 n,数字 1,2,..,n 在表中满足从左到右和从上到下严格递增。设第 i 行的长度为 λi,则 λi≥λi−1,∑iλi=n,大小为 n 的杨表形态 (λ1,λ2,...) 与 n 的整数划分一一对应。
形态为 (5,4,1) 的杨表:
设 Y(λ) 为划分 λ 对应形态的杨表,f(λ) 表示杨表 Y(λ) 中填数的方案数。
设划分 λ,μ 分别是 n,n−1 的划分(n≥2),若 ∃j,s.t.∀i≠j,λi=μi,λj=μi+1,记 μ↑λ。
对于 (i,j)∈Y(λ),记 Hλ(i,j) 表示 (i,j) 自身以及下方和右方的格子集合(Hook),hλ(i,j)=|Hλ(i,j)| 。
钩子公式
Hook Formula:
f(λ)=n!∏(i,j)∈Y(λ)hλ(i,j)
Proof:
设 c1,c2,..,cm 为 hλ(i,j)=1 的位置,记 μi=λ/{ci},显然 {μ1,μ2,..,μm}={μ|μ↑λ} 。
f(λ) 满足 f(λ)=∑μ↑λf(μ),设 e(λ)=n!∏(i,j)∈Y(λ)hλ(i,j),由于 f(∅)=e(∅)=1:
f(λ)=e(λ)⟺e(λ)=∑μ↑λe(μ)
于是命题转化成证明:m∑i=1e(μi)e(λ)=1 。
定义以下随机游走(Hook Walk):
- 随机选取一个位置 (i,j)∈Y(λ) 出发。
- 每次从 (i,j) 等概率地走到 Hλ(i,j)/{(i,j)} 中随机一格。
- 若来到某个位置 ci,则随机过程结束。
显然 ∑mi=1P(终点为 ci)=1,下证 P(终点为 ci)=e(μi)e(λ) :
注意到 hλ(i,j)+hλ(i+1,j+1)=hλ(i,j+1)+hλ(i+1,j),且只有在 (i,j) 正上方和正右方的位置可以走到 (i,j) 。于是构造二维矩阵 {hi,j},{pi,j} :
⎧⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪⎩h0,0=0,hi,0,h0,j∈N+i>0,j>0hi,j=hi,j−1+hi−1,j−hi−1,j−1i,j>0p0,0=1,pi,j=1hi,j(i−1∑a=0pa,j+j−1∑b=0pi,b)(i,j)≠(0,0)
Lemma:i∑k=0j∑l=0pk,l=i∏k=0(1+1hk,0)j∏l=0(1+1h0,l)
Proof:考虑归纳,首先容易验证 i,j∈{0,1} 上式成立。
根据 hi,j 的递推式,容易得到 hi,j=hi,0+h0,j 。设 S(i,j)=i∑k=0j∑l=0pk,l,对于 S(i,0),其值相当于从 (0,0) 出发,每次向下走若格,然后标记一个 hi,0,由归纳容易得到 S(i,0)=∏ik=0(1+1hk,0) 以及类似地 S(0,j)=∏jl=0(1+1h0,l),两者满足条件。对于当前 i,j>0,假设 S(i−1,j−1),S(i−1,j),S(i,j−1) 均满足条件,则
S(i,j)=pi,j+S(i−1,j)+S(i,j−1)−S(i−1,j−1)=1hi,j(i−1∑k=0pk,j+j−1∑l=0pi,l)+S(i−1,j−1)(1+1h0,j+1+1hi,0−1)=1hi,j(S(i−1,j)+S(i,j−1)−2S(i−1,j−1))+S(i−1,j−1)(1+1h0,j+1hi,0)=S(i−1,j−1)(1hi,0+h0,j(1h0,j+1hi,0)+1+1h0,j+1hi,0)=S(i−1,j−1)(1+1h0,j)(1+1hi,0)=i∏k=0(1+1hk,0)j∏l=0(1+1h0,l)(1)(2)(3)(4)(5)(6)
由归纳 Lemma 得证。
对应到原问题,对于 (a,b),令 hi,0 和 h0,j 为 hλ(a−i,b)−1 和 hλ(a,b−j)−1,则对于任意 i,j≥0 有 hi,j=hλ(a−i,b−j)−1,pi,j 为从 (a−i,b−j) 走到 (a,b) 的概率。令 (a,b) 为 ci :
P(终点为 ci)=1na−1∑i=0b−1∑j=0pi,j=1na−1∏i=0(1+1hλ(a−i,b)−1)b−1∏j=0(1+1hλ(a,b−j)−1)=a−1∏i=0hλ(a,b−j)b−1∏j=0hλ(a,b−j)na−1∏i=0(hλ(a,b−j)−1)b−1∏j=0(hλ(a,b−j)−1)=e(μi)e(λ)
因此 Hook Formula 得证。
应用
有一个 n×m 的网格,你希望用 3−连通块(triomino) 覆盖整个网格,每个块从 1 到 nm/3 标号。对于两个块 X,Y,若 X 的某个格子位于 Y 的一个格子的正左方或正上方,则 X 的标号需要小于 Y 。
求带标号的覆盖方案数,模 109+7 。1≤n,m≤104
HackerRank : Triomino Tiling
标号方式使得可能出现两个块的标号关系是自相矛盾的,因此合法的 triomino 只有 4 种:
#
#
#
考虑从左上角开始填,使得轮廓线任意时刻都是单调的,即长度为 n+m,记竖着的线段为 1,横着的为 0,则任意时刻的轮廓线都可以表示为长度为 n+m 的 01 序列,其中有 n 个 1 和 m 个 0 。
对于每种合法 triomino,加入时对轮廓线产生的变化分别为:1110 -> 0111
,1100 -> 0101
,1010 -> 0011
,1000 -> 0001
。可以发现,无论中间两个值是什么,加入一个 triomino 都是将两边的 01
互换。
本来是要 111...11000...0
转变为 000...0111...11
,现在能做的操作是将两个相距 3 格的 01
互换,考虑将序列位置按照 mod3 分开考虑。于是现在有三个 11..10..00
,每次可以将相邻的 01
互换,最终变成 0..0011..1
,求方案数。
将这个问题往回转,可以发现就是在网格里单调地填方块,方块先后顺序需要满足的约束与杨表相同,因此就是一个矩形杨表计数问题,设矩形为 n×m,则方案数为:
(nm)!n∏i=1m∏j=1(i+j−1)=(nm)!∏ni=1(i−1)!∏ni=1(i+m−1)!
设 S(n)=∏ni=1i!,则答案为 (nm)!S(n−1)S(m−1)S(n+m−1),于是预处理阶乘,时间复杂度为 O(nm+T) 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现