좋은 접두사

시간 제한1초메모리 제한128 MB

요약
길이 L인 문자열 중 모든 접두사에서 각 문자의 등장 횟수 차이가 2 이하인 문자열의 개수를 K와 함께 세어 1e9+7로 나눈 나머지를 구한다. L은 10^18까지 커진다.
난이도

어려움10점 중 9점

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

문제

크기가 KK인 알파벳으로 이루어진 문자열을 생각하자. 예를 들어 K=4K = 4이면 알파벳은 {a,b,c,d}\{a, b, c, d\}일 수 있고, 그런 문자열의 예로 bbcacbbcac가 있다.

문자열 SS에 대해 count(S,k)\mathrm{count}(S, k)를 SS에서 기호 kk가 나타나는 횟수라고 정의한다. 예를 들어 count(bbcac,b)=2\mathrm{count}(bbcac, b) = 2이고 count(bbcac,a)=1\mathrm{count}(bbcac, a) = 1이다.

문자열 SS의 접두사는 SS의 뒤쪽 문자들을 00개 이상 지워서 얻는 문자열이다. 예를 들어 acbacb의 접두사는 빈 문자열, aa, acac, acbacb이다.

문자열 SS가 좋은 접두사를 가진다는 것은, SS의 모든 접두사 PP와 알파벳의 임의의 두 기호 k1k_1, k2k_2에 대해 ∣count(P,k1)−count(P,k2)∣≤2|\mathrm{count}(P, k_1) - \mathrm{count}(P, k_2)| \le 2가 성립함을 뜻한다. 예를 들어 bbcacbbcac는 좋은 접두사를 가지지만, abbbcabbbc는 그렇지 않다. count(abbb,b)=3\mathrm{count}(abbb, b) = 3이고 count(abbb,c)=0\mathrm{count}(abbb, c) = 0이기 때문이다.

크기가 KK인 알파벳 위에서 길이가 LL이며 좋은 접두사를 가지는 문자열의 개수를 구하여라. 이 수가 클 수 있으므로 10000000071000000007로 나눈 나머지를 출력한다.

입력

한 줄에 두 정수 LL과 KK가 공백으로 구분되어 주어진다. 1≤L≤10181 \le L \le 10^{18}, 1≤K≤501 \le K \le 50이다.

출력

크기가 KK인 알파벳 위에서 길이가 LL이며 좋은 접두사를 가지는 문자열의 개수를 10000000071000000007로 나눈 나머지를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    4 2
    
    예상 출력
    12