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

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

문자열 게임

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

요약
주어진 이진 문자열에서 000 또는 11을 지우거나 인접한 서로 다른 두 문자를 바꾸는 연산으로 만들 수 있는 길이 k의 서로 다른 문자열 개수를 구한다.
난이도

보통10점 중 7점

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

문제

그리샤와 디마는 다시 게임을 한다. 이번에는 0과 1로 이루어진 문자열이 있다. 문자열에 다음 연산을 할 수 있다.

  • 연속한 1 세 개를 지운다.
  • 연속한 0 두 개를 지운다.
  • 부분 문자열 "01"을 부분 문자열 "10"으로 바꾼다.
  • 부분 문자열 "10"을 부분 문자열 "01"으로 바꾼다.

예를 들어 한 번의 연산으로 문자열 "00111"에서 문자열 "00", "111", "01011"을 얻을 수 있다.

이제 두 사람이 궁금해하는 것은 다음 질문이다. 주어진 문자열에서 설명한 연산을 사용해 길이 kk인 서로 다른 문자열을 몇 개나 얻을 수 있는가. 그리샤와 디마는 시험 때문에 바빠서 당신에게 도움을 청한다.

문자열과 수 kk가 주어졌을 때, 주어진 문자열에서 설명한 연산을 사용해 얻을 수 있는 길이 kk인 서로 다른 문자열의 개수를 구하라.

입력

첫째 줄에 입력에 주어지는 테스트 케이스의 개수인 양의 정수 tt (1≤t≤10001 \le t \le 1000)가 주어진다. 다음으로 테스트 케이스의 설명이 이어진다.

각 테스트 케이스는 두 줄로 설명된다. 첫째 줄에 두 양의 정수 nn과 kk (1≤k≤n≤1001 \le k \le n \le 100)가 주어진다. 이는 원래 문자열의 길이와 얻고자 하는 문자열의 길이이다. 둘째 줄에 0과 1로 이루어진 길이 nn의 문자열이 주어진다.

출력

tt개의 줄을 출력하라. 각 테스트 케이스에 대해 주어진 문자열에서 설명한 연산을 사용해 얻을 수 있는 길이 kk인 문자열의 개수를 출력하라. 답이 매우 클 수 있으므로 109+710^9 + 7로 나눈 나머지를 출력하라.

예제1

  1. 예제 1

    입력
    4
    2 2
    10
    4 2
    0000
    5 2
    01010
    5 2
    10101
    
    예상 출력
    2
    1
    0
    1