사이클의 개수

방향 그래프에서 길이가 K 미만인 모든 닫힌 보행(사이클)의 개수를 회전을 서로 다른 것으로 세어 M으로 나눈 나머지를 구한다.

어려움8그래프행렬동적 계획법조합론아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

방향 그래프 GG가 주어진다. 길이가 KK보다 작은 서로 다른 사이클의 개수를 구하는 프로그램을 작성하시오. 이 개수는 매우 커질 수 있으므로 MM으로 나눈 나머지를 출력한다.

사이클은 노드를 차례로 나열한 것이며, 같은 노드가 여러 번 나와도 된다. 각 노드에서 다음 노드로 가는 간선이 있어야 하고, 마지막 노드에서 첫 번째 노드로 가는 간선도 있어야 한다. 사이클의 길이는 나열한 노드의 개수이다. 나열 순서가 다르면 서로 다른 사이클로 센다. 예를 들어 (0,1,2)(0, 1, 2)(1,2,0)(1, 2, 0)은 서로 다른 사이클이다.

노드에는 00번부터 N1N-1번까지 번호가 붙어 있다.

입력

첫째 줄에 그래프 GG의 노드 개수 NNKK, MM이 주어진다. (1N351 \le N \le 35, 1K1061 \le K \le 10^6, 1M1091 \le M \le 10^9)

둘째 줄부터 NN개의 줄에 그래프의 간선 정보가 인접 행렬 형식으로 주어진다. ii번째 줄의 jj번째 문자는 ii번 노드에서 jj번 노드로 가는 간선 정보이다. Y는 간선이 있다는 뜻이고, N은 간선이 없다는 뜻이다. 입력으로 주어지는 그래프에는 루프가 없다. 즉 ii번째 줄의 ii번째 문자는 항상 N이다.

출력

첫째 줄에 길이가 KK보다 작은 서로 다른 사이클의 개수를 MM으로 나눈 나머지를 출력한다.

힌트

첫 번째 예제에서 길이가 66보다 작은 사이클은 다음과 같다.

  • (0,3)(0,3), (3,0)(3,0), (0,1,2)(0,1,2), (1,2,0)(1,2,0), (2,0,1)(2,0,1), (0,3,0,3)(0,3,0,3), (3,0,3,0)(3,0,3,0), (0,1,2,0,3)(0,1,2,0,3), (0,3,0,1,2)(0,3,0,1,2), (1,2,0,3,0)(1,2,0,3,0), (2,0,3,0,1)(2,0,3,0,1), (3,0,1,2,0)(3,0,1,2,0)