만드는 중입니다

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

사이클의 개수

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

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

어려움10점 중 8점

유형
그래프, 행렬, 동적 계획법, 조합론
정답자
아직 제출이 없습니다

문제

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

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

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

입력

첫째 줄에 그래프 GG의 노드 개수 NN과 KK, MM이 주어진다. (1≤N≤351 \le N \le 35, 1≤K≤1061 \le K \le 10^6, 1≤M≤1091 \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)

예제6

  1. 예제 1

    입력
    4 6 100
    NYNY
    NNYN
    YNNN
    YNNN
    
    예상 출력
    12
    
  2. 예제 2

    입력
    7 40 13
    NYNNNNN
    NNYNNNN
    NNNYNNN
    NNNNYNN
    NNNNNYN
    NNNNNNY
    YNNNNNN
    
    예상 출력
    9
    
  3. 예제 3

    입력
    4 1000000 1000000000
    NYNY
    NNNN
    YYNY
    NYNN
    
    예상 출력
    0
    
  4. 예제 4

    입력
    2 1500 1
    NY
    YN
    
    예상 출력
    0
    
  5. 예제 5

    입력
    7 30 100
    NYYNYYN
    YNYNYNY
    NYNYNYN
    YYYNYNY
    NNYYNNY
    NYYYNNY
    YYYYYYN
    예상 출력
    72
    
  6. 예제 6

    입력
    4 1000 10000
    NYYY
    YNYY
    YYNY
    YNYN
    
    예상 출력
    3564