DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

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−IM^6=2M^5+3M^3+2M^2+M-IM6=2M5+3M3+

を満たす。したがって n≥6n\geq6n≥6 に対して

fn=2fn−1+3fn−3+2fn−4+fn−5−fn−6f_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 ビットで表す独立した実装である。

直線形と L 字形の両方を数える必要がある。縦向きの直線形トロミノは高さが 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
111
646464
6)<
1.01⋅
1018
646464
n​
+
xn​
,
=fn​+2un​+2wn​+yn​,
=un​,
=fn​+wn​,
=fn​.
​