페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#10415

나누어떨어지는 분할 60s 1024MB

문제

10진수 숫자들로 이루어진 문자열 \mathbf{S}가 있다. \mathbf{S}분할(division)은 \mathbf{S}를 연속한 부분 문자열들로 나누어 만드는 것이다. 예를 들어 \mathbf{S}0145217이라면, 가능한 분할의 예로 014 5 21 7, 0 14 52 17이 있다. 각 숫자는 정확히 하나의 부분 문자열에만 포함되어야 하고, 각 부분 문자열은 비어 있으면 안 된다. \mathbf{S}의 길이가 L이라면, 가능한 분할의 개수는 정확히 2^{L-1}개이다.

양의 정수 \mathbf{D}가 주어졌을 때, \mathbf{S}의 분할이 \mathbf{D}나누어떨어진다(divisible)고 하려면 서로 이웃한 두 부분 문자열의 쌍마다, 그 둘이 10진수 정수로 나타내는 값 중 적어도 하나가 \mathbf{D}로 나누어떨어져야 한다. \mathbf{D}=7이라면, 위의 첫 번째 분할 예시는 014, 21, 7이 모두 7로 나누어떨어지므로 divisible이다. 하지만 두 번째 분할 예시는 5217이 서로 이웃한 부분 문자열인데 어느 쪽도 7로 나누어떨어지지 않으므로 divisible이 아니다. 또한 0145217을 그냥 0145217 하나로만 분할하면, 서로 이웃한 부분 문자열의 쌍이 존재하지 않으므로 어떤 \mathbf{D}에 대해서도 divisible이다.

\mathbf{S}\mathbf{D}가 주어질 때, \mathbf{D}로 divisible한 \mathbf{S}의 분할이 몇 개인지 세어라. 출력 값이 매우 커질 수 있으므로, 결과를 소수 10^9+7(1000000007)로 나눈 나머지만 출력하라.


입력

입력의 첫 줄에는 테스트 케이스 수 \mathbf{T}가 주어진다. 그 다음 \mathbf{T}줄이 이어진다. 각 줄은 테스트 케이스 하나를 나타내며, 위에서 설명한 숫자 문자열 \mathbf{S}와 양의 정수 \mathbf{D}가 주어진다.


출력

각 테스트 케이스마다 Case #x: y 형식의 한 줄을 출력하라. 여기서 x는 (1부터 시작하는) 테스트 케이스 번호이고, y\mathbf{S}의 분할들 중 \mathbf{D}로 divisible한 분할의 개수를 소수 10^9+7(1000000007)로 나눈 나머지이다.


예제

3
0145217 7
100100 10
5555 12
Case #1: 16
Case #2: 30
Case #3: 1
샘플 케이스 #1에서 \mathbf{S}의 16개 가능한 나눗셈(모든 부분 문자열이 조건을 만족하는 분할)은 다음과 같다: 0145217, 0 145217, 0 14 5217, 0 14 5 217, 0 14 5 21 7, 0 14 521 7, 0 145 217, 0 145 21 7, 0 14521 7, 014 5217, 014 5 217, 014 5 21 7, 014 521 7, 0145 217, 0145 21 7, 그리고 014521 7. 샘플 케이스 #2에서는 총 분할 방법이 2^5=32가지다. 연속한 두 부분 문자열이 10으로 나누어떨어지지 않게 하려면 둘 다 0으로 끝나지 않아야 한다. 이를 만족하는 방법은 1 001 00과 1 001 0 0 두 가지뿐이므로, 나머지 30가지 분할은 \mathbf{S}의 부분 문자열이 10으로 나누어떨어진다. 샘플 케이스 #3에서는 어떤 부분 문자열도 짝수를 나타내지 않으므로 12로도 나누어떨어지지 않는다. 따라서 연속한 두 부분 문자열이 12로 나누어떨어지지 않게 하지 않으려면, 연속한 두 부분 문자열 자체가 없도록 해야 한다. 이것은 한 가지 방법(5555)으로만 가능하다.

출처

GCJ 2021wf D

로그인해야 코드를 작성할 수 있어요.