DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

DT-Tiling

返回题目

题解

轮廓状态

假设当前列左侧的所有格子均已填满。横放的直条形三格骨牌长度为 333,因此已放置的骨牌只能在当前列和下一列留下占用。用四位掩码记录这两列:第 0,10,10,1 位对应当前列的上下格,第 2,32,32,3 位对应下一列的上下格。

每次放置一块覆盖当前列第一个空格的骨牌。当前列填满后,将掩码右移两位。固定选择第一个空格可避免因放置顺序不同而重复计数。从掩码 000 开始,处理完 NNN 列后仅统计掩码仍为 000 的状态。

可达掩码为 0,1,2,3,5,7,10,11,150,1,2,3,5,7,10,11,150,1,2,3,5,7,10,11,15。上下对称的掩码计数相同。处理 nnn 列后,令 fn,un,vn,wn,xn, 分别表示掩码 的计数。其中掩码 与 、 与 、 与 的计数分别相等。

注意记录的是一个掩码的计数,而不是对称两者之和。枚举覆盖第一个空格的所有放法,可得以下转移。

fn+1=fn+vn,un+1=fn+un+xn,vn+1=fn+2un+2wn+yn,wn+1=un,xn+1=fn+wn, (f0,u0,v0,w0,x0,y0)=(1,0,0,0,0,0).(f_0,u_0,v_0,w_0,x_0,y_0)=(1,0,0,0,0,0).(f0​,u0​,v

线性 DP 与矩阵快速幂

执行 NNN 次转移,时间复杂度为 O(N)O(N)O(N),空间复杂度为 O(1)O(1)O(1),可以通过子任务 2。完整限制下,将六个量组成列向量,写成 sn+1=Msns_{n+1}=Ms_nsn,其中

M=(101000110010120201010000100

用二进制快速幂求 MNM^NMN,时间复杂度为 O(63log⁡N)O(6^3\log N)O(63logN),空间复杂度为 O(62)O(6^2)O(。所有运算均对 取模。

所附代码使用的递推

转移矩阵满足

M6=2M5+3M3+2M2+M−I.M^6=2M^5+3M^3+2M^2+M-I.M6=2M5+3M3+

所以对于 n≥6n\geq6n≥6,有

fn=2fn−1+3fn−3+2fn−4+fn−5−fn−6,f_n=2f_{n-1}+3f_{n-3}+2f_{n-4}+f_{n-5}-f_{n-6},fn​=2fn−1​

初值为

(f0,f1,f2,f3,f4,f5)=(1,1,2,6,17,43).(f_0,f_1,f_2,f_3,f_4,f_5)=(1,1,2,6,17,43).(f0​,f1​,f

线性解法直接计算该递推。正解对状态 (fn,fn−1,⋯ ,fn−5)(f_n,f_{n-1},\cdots,f_{n-5})(fn​,fn−1​,⋯,f 的 伴随矩阵进行快速幂。将系数 表示为模数减一,指数必须使用 位整数。

子任务 1 可用位掩码表示全部 2N2N2N 个格子,每次尝试所有覆盖第一个空格的骨牌,并记忆化占用掩码。按从左到右的顺序填充时,未完成状态只涉及边界附近的两列,因此每列只有常数个状态。线性查找第一个空格的实现需要 O(N2)O(N^2)O(N2) 时间和 O(N)O(N)O(N) 个存储状态。所附 naive 使用至多 404040 位表示整块棋盘,独立于递推实现。

两种三格骨牌都不能遗漏。竖放的直条形三格骨牌高度为 333,不能放入棋盘。空棋盘的计数 f0=1f_0=1f0​=1 只用于初值,输入不包含 N=0N=0N=0。

每次乘加后取模,中间值不超过 (109+6)2+(109+6)<1.01⋅1018(10^9+6)^2+(10^9+6)<1.01\cdot10^{18}(109+6)2+(109+,因此有符号 位整数足够。

Solution written by GPT

ynf_n,u_n,v_n,w_n,x_n,y_n
fn​,un​,vn​,wn​,xn​,yn​
0,1,3,5,7,150,1,3,5,7,150,1,3,5,7,15
111
222
555
101010
777
111111
yn+1=fn.\begin{aligned} f_{n+1}&=f_n+v_n,\\ u_{n+1}&=f_n+u_n+x_n,\\ v_{n+1}&=f_n+2u_n+2w_n+y_n,\\ w_{n+1}&=u_n,\\ x_{n+1}&=f_n+w_n,\\ y_{n+1}&=f_n. \end{aligned}
fn+1​un+1​vn+1​wn+1​xn+1​yn+1​​=fn​+vn​,=fn​+u
0​
,
w0​
,
x0​
,
y0​
)
=
(1,0,0,0,0,0).
+
1
​
=
Msn​
100100000).M=\begin{pmatrix} 1&0&1&0&0&0\\ 1&1&0&0&1&0\\ 1&2&0&2&0&1\\ 0&1&0&0&0&0\\ 1&0&0&1&0&0\\ 1&0&0&0&0&0 \end{pmatrix}.
M=​111011​012100​100000​002010​010000​001000​​.
62
)
1 000 000 0071\,000\,000\,0071000000007
2
M2
+
M−
I.
+
3fn−3​+
2fn−4​+
fn−5​−
fn−6​,
2​
,
f3​
,
f4​
,
f5​
)
=
(1,1,2,6,17,43).
n−5
​
)
6×66\times66×6
−1-1−1
646464
6)<
1.01⋅
1018
646464
n​
+
xn​
,
=fn​+2un​+2wn​+yn​,
=un​,
=fn​+wn​,
=fn​.
​