아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

반복도

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

요약
문자열의 서로 다른 모든 부분수열에 대해 등장 횟수의 제곱을 합한 값을 M으로 나눈 나머지를 구한다.
난이도

보통10점 중 7점

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

문제

길이가 nn인 문자열은 문자들의 어떤 부분집합을 지워서 얻는 2n2^n개의 부분 수열(subsequence)을 가진다. 하지만 이 부분 수열들이 모두 서로 다른 것은 아니다. 예를 들어 문자열 "zoo"가 가지는 서로 다른 부분 수열은 6개뿐이다.

  • "z", "oo", "zoo"는 각각 한 번씩만 나타나고,
  • 빈 부분 수열도 한 번만 나타나며,
  • "o"와 "zo"는 각각 두 번씩 나타난다.

문자열 SS에 서로 다른 부분 수열이 kk개 있고, 그중 ii번째 부분 수열이 fif_i번 나타난다고 하자. 이때 SS의 반복도(repetitivity) 를 ∑i=1kfi2\sum_{i=1}^{k} f_i^2로 정의한다. 예를 들어 "zoo"의 반복도는

12+12+12+12+22+22=121^2 + 1^2 + 1^2 + 1^2 + 2^2 + 2^2 = 12

이다.

입력

첫째 줄에 문자열 SS가 주어진다. SS의 길이는 최대 1000010000이다. 둘째 줄에 정수 MM이 주어지며 2≤M≤1092 \le M \le 10^9을 만족한다. SS는 ASCII 코드가 3333 이상 126126 이하인 문자만 포함한다(모두 출력 가능하고 공백이 아닌 문자이다).

출력

SS의 반복도를 MM으로 나눈 나머지를 첫째 줄에 출력한다.

예제2

  1. 예제 1

    입력
    zoo
    10
    
    예상 출력
    2
    
  2. 예제 2

    입력
    @#$%
    1000000
    
    예상 출력
    16