메시지

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

요약
길이 n인 소문자 문자열 가운데 주어진 패턴 p를 부분 문자열로 포함하는 것의 개수를 m으로 나눈 나머지를 구한다. n은 10^12까지, p의 길이는 최대 50이다.
난이도

어려움10점 중 9점

유형
동적 계획법, 문자열 매칭, 행렬, 조합론
정답자
아직 제출이 없습니다

문제

어떤 학생이 친구에게 메시지를 보내려고 한다. 메시지는 알파벳 소문자로만 이루어진 문자열 pp이다. 메시지를 암호화하기 위해 학생은 pp를 부분 문자열로 포함하는 길이 nn의 소문자 알파벳 문자열 hh를 만든다. 학생은 이런 문자열 hh를 만드는 서로 다른 방법의 수가 얼마인지 궁금해한다.

양의 정수 nn, mm과 알파벳 소문자로만 이루어진 문자열 pp가 주어질 때, pp를 부분 문자열로 포함하는 길이 nn의 소문자 알파벳 문자열 hh를 만드는 서로 다른 방법의 수를 KK라고 하자. KK를 mm으로 나눈 나머지를 구하라.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 첫째 줄에는 데이터셋의 개수가 주어지며, 이는 양의 정수이고 20 이하이다. 다음 줄부터 데이터셋이 주어진다.

각 데이터셋은 다음과 같이 이루어진다.

  • 첫째 줄에 두 양의 정수 nn, mm이 주어진다. (n≤1012n \le 10^{12}; m≤1012m \le 10^{12})
  • 다음 줄에 알파벳 소문자가 최대 50개인 문자열 pp가 주어진다.

출력

각 데이터셋에 대해 KK를 mm으로 나눈 나머지를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    2
    2 100
    ab
    3 100
    ab
    
    예상 출력
    1
    52