피보나치 단어

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

요약
비트 패턴 p와 100 이하의 n이 주어질 때, 길이가 지수적으로 커지는 피보나치 단어 F(n) 안에서 p가 겹쳐서 나타나는 횟수를 센다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 동적 계획법, 문자열, 분할 정복
정답자
아직 제출이 없습니다

문제

피보나치 단어 수열 F(n)F(n)은 다음과 같이 정의된다. 여기서 ++는 두 문자열을 이어 붙이는 것을 뜻한다. F(0)F(0)은 문자열 0, F(1)F(1)은 문자열 1이고, n≥2n \ge 2에 대해 F(n)=F(n−1)+F(n−2)F(n) = F(n-1) + F(n-2)이다.

처음 몇 항은 다음과 같다.

nnF(n)F(n)
00
11
210
3101
410110
510110101
61011010110110
7101101011011010110101
81011010110110101101011011010110110
91011010110110101101011011010110110101101011011010110101

비트 패턴 pp와 정수 nn이 주어졌을 때, F(n)F(n) 안에 pp가 몇 번 나타나는지 세는 프로그램을 작성하여라. 이때 나타나는 위치는 서로 겹쳐도 된다.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 파일의 끝까지 계속된다.

각 테스트 케이스는 두 줄로 주어진다. 첫째 줄에는 정수 nn이 주어진다 (0≤n≤1000 \le n \le 100). 둘째 줄에는 비트 패턴 pp가 주어진다. pp는 비어 있지 않은 문자열이며, 길이는 최대 100 000100\,000이다.

출력

각 테스트 케이스마다 한 줄씩 Case x: k 형식으로 출력한다. 여기서 xx는 11부터 시작하는 테스트 케이스 번호이고, kk는 F(n)F(n) 안에서 비트 패턴 pp가 (겹침을 허용하여) 나타나는 횟수이다. 이 값은 항상 2632^{63}보다 작음이 보장된다.

예제4

  1. 예제 1

    입력
    6
    10
    7
    10
    6
    01
    6
    101
    96
    10110101101101
    
    예상 출력
    Case 1: 5
    Case 2: 8
    Case 3: 4
    Case 4: 4
    Case 5: 7540113804746346428
    
  2. 예제 2

    입력
    0
    0
    
    예상 출력
    Case 1: 1
    
  3. 예제 3

    입력
    1
    0
    
    예상 출력
    Case 1: 0
    
  4. 예제 4

    입력
    2
    10
    
    예상 출력
    Case 1: 1