만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Grid Guardian

시간 제한8초메모리 제한512 MB

요약
n×m 격자에서 모든 2×2 부분 격자에 장애물이 하나 이상 있도록 최소 개수의 장애물을 놓는 방법의 수를 p로 나눈 나머지로 구합니다.
난이도

어려움10점 중 9점

유형
동적 계획법, 비트 연산
정답자
아직 제출이 없습니다

문제

앨리스는 n×mn \times m 격자에 2×22 \times 2 블록을 놓으려 한다. 블록은 축에 평행하게 놓여야 하며, 정확히 격자 칸 4개를 덮어야 한다.

밥은 앨리스가 블록을 놓지 못하게 막으려 한다. 그래서 일부 칸에 장애물을 놓는다. 장애물을 놓은 뒤에는 격자의 모든 2×22 \times 2 부분 격자에 장애물이 적어도 하나 있어야 한다. 밥은 장애물을 가능한 한 적게 놓으려 한다.

앨리스가 블록을 놓지 못하도록 밥이 최소 개수의 장애물을 놓는 방법의 수를 구하라. 답은 소수 pp로 나눈 나머지로 출력한다. 답은 장애물의 최소 개수가 아니라 놓는 방법의 수이다. 예를 들어 n=m=2n = m = 2이면 밥은 장애물 1개만 놓으면 되고, 그 방법은 4가지이므로 답은 4이다.

입력

첫 줄에 공백으로 구분된 세 정수 nn (2≤n≤252 \le n \le 25), mm (2≤m≤1032 \le m \le 10^3), pp (108≤p≤109+710^8 \le p \le 10^9 + 7)가 주어진다. 격자의 크기는 n×mn \times m이며, pp는 소수인 나눗셈 법이다.

출력

밥이 n×mn \times m 격자에 최소 개수의 장애물을 놓아 앨리스가 2×22 \times 2 블록을 놓지 못하게 하는 방법의 수를 pp로 나눈 나머지를 한 정수로 출력한다.

예제2

  1. 예제 1

    입력
    4 4 999999937
    
    예상 출력
    79
    
  2. 예제 2

    입력
    5 5 100000037
    
    예상 출력
    1