DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제문제집
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

DT-Tiling

문제로 돌아가기

해설

경계 상태

현재 열보다 왼쪽의 모든 칸을 채운 상태를 생각하자. 가로로 놓인 일자 트로미노의 길이가 333이므로, 이미 놓은 타일은 현재 열과 그다음 열에만 남아 있을 수 있다. 이 두 열의 네 칸을 비트마스크로 나타낸다. 비트 0,10,10,1은 현재 열의 위아래 칸, 비트 2,32,32,3은 다음 열의 위아래 칸이다.

현재 열에서 가장 위의 빈 칸을 덮는 타일을 하나씩 놓는다. 현재 열이 가득 차면 마스크를 오른쪽으로 222비트 이동한다. 항상 첫 번째 빈 칸을 선택하므로 같은 배치를 여러 번 세지 않는다. 시작 마스크는 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열을 처리한 뒤의 다음 여섯 값을 정의하자.

  • fnf_nfn​: 마스크 000의 경우의 수.
  • unu_nun​: 마스크 11의 경우의 수. 마스크 의 경우의 수와 같다.

대칭인 두 마스크의 합이 아니라 한 마스크의 경우의 수를 저장한다. 첫 번째 빈 칸을 덮는 모든 배치를 열거하면 다음 전이를 얻는다.

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) 공간에 답을 구할 수 있다. 이는 두 번째 서브태스크를 통과한다.

전체 제한에서는 여섯 값을 열벡터로 두고 전이를 sn+1=Msns_{n+1}=Ms_nsn+1​=Msn​으로 나타낸다. 이때

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를 상태로 하는 행렬을 거듭제곱한다. 마이너스 계수는 법에서 을 뺀 값으로 나타내고, 지수는 64비트 정수로 저장해야 한다.

작은 입력의 완전탐색

첫 번째 서브태스크에서는 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+이므로 signed 64-bit 정수로 충분하다.

Solution written by GPT

1
222
  • vnv_nvn​: 마스크 333의 경우의 수.
  • wnw_nwn​: 마스크 555의 경우의 수. 마스크 101010의 경우의 수와 같다.
  • xnx_nxn​: 마스크 777의 경우의 수. 마스크 111111의 경우의 수와 같다.
  • yny_nyn​: 마스크 151515의 경우의 수.
  • 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).
    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
    111
    6)<
    1.01⋅
    1018
    n​
    +
    xn​
    ,
    =fn​+2un​+2wn​+yn​,
    =un​,
    =fn​+wn​,
    =fn​.
    ​