만드는 중입니다

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

도미노 덮기

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

요약
n이 35 이하, m이 10^18 이하인 격자를 도미노로 덮는 방법의 수를 각 질의의 소수 p로 나눈 나머지로 구합니다.
난이도

어려움10점 중 9점

유형
행렬, 동적 계획법, 분할 정복, 수학
정답자
아직 제출이 없습니다

문제

Elizur에게 빈 n×mn \times m 격자가 있다. 그는 1×21 \times 2 과 2×12 \times 1 도미노 몇 개로 격자 전체를 덮으려 한다. 각 도미노는 인접한 두 칸을 정확히 덮고, 각 칸은 정확히 하나의 도미노에 덮인다. 두 칸이 변을 공유하면 인접하다고 한다.

nn과 mm 중 적어도 하나가 짝수일 때에만 덮을 수 있다. 그렇지 않으면 반드시 빈 칸이 남는다. 그는 격자 전체를 덮는 방법이 몇 가지인지 알고 싶어 한다. 두 덮개는 한쪽 도미노와 다른 쪽 도미노 중 어떤 두 도미노가 같은 칸 하나를 덮으면서도 다른 칸은 다르게 덮는 경우가 있으면 서로 다른 방법으로 본다.

답은 매우 클 수 있으므로, 소수 pp로 나눈 나머지를 구한다.

입력

첫 줄에 질문의 개수 TT (1≤T≤200001 \le T \le 20000)가 주어진다.

이어지는 TT개의 줄에는 각각 세 정수 nn (1≤n≤351 \le n \le 35), mm (1≤m≤10181 \le m \le 10^{18}), pp (2≤p≤2302 \le p \le 2^{30}, pp는 소수)가 주어진다.

n>5n > 5 이거나 m>109m > 10^9 인 질문은 최대 1000개이다.

출력

각 질문마다 덮는 방법의 수를 pp로 나눈 나머지를 한 줄에 출력한다.

힌트

그림은 3×43 \times 4 격자를 덮는 가능한 11가지 방법을 모두 보여준다.

예제1

  1. 예제 1

    입력
    6
    2 2 23
    2 3 233
    3 3 2333
    3 4 23333
    4 4 2332333
    5 251346744251346744 998244353
    
    예상 출력
    2
    3
    0
    11
    36
    295381485