만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Anti-hash 테스트

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

요약
주어진 n과 문자열 u로 s(n)에서 u가 나타나는 횟수를 구하고, 같은 횟수를 갖는 문자열 v의 개수를 구합니다.
난이도

어려움10점 중 9점

유형
문자열 매칭, 재귀, 수학
정답자
아직 제출이 없습니다

문제

다음 문자열 s(n)=s0s1…s2n−1s(n) = s_0 s_1 \ldots s_{2^n-1}은 2642^{64}를 법으로 하는 다항식 해시를 사용하는 거의 모든 풀이를 공격할 수 있다.

si={a,popcount(i) mod 2=0b,popcount(i) mod 2=1s_i = \begin{cases} \text{a}, & \mathrm{popcount}(i) \bmod 2 = 0 \\ \text{b}, & \mathrm{popcount}(i) \bmod 2 = 1 \end{cases}

여기서 popcount(i)\mathrm{popcount}(i)는 ii의 이진 표현에서 1의 개수이다.

문자열 uu와 정수 nn이 주어진다. s(n)s(n)에서 uu가 나타나는 횟수와, s(n)s(n)에서 같은 횟수로 나타나는 서로 다른 문자열 vv의 개수를 구하라. 두 값은 매우 클 수 있으므로 109+710^9 + 7로 나눈 나머지를 구한다.

입력

여러 개의 테스트 케이스가 주어진다. 첫 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스는 두 줄로 이루어진다.

첫 줄에 정수 nn (1≤n≤10181 \le n \le 10^{18})이 주어진다.

둘째 줄에는 a와 b로만 이루어진 문자열 uu (1≤∣u∣≤min⁡(106,2n)1 \le |u| \le \min(10^6, 2^n))가 주어진다.

모든 테스트 케이스의 ∣u∣|u| 합은 10610^6을 넘지 않는다.

출력

각 테스트 케이스마다 uu가 s(n)s(n)에 나타나지 않으면 −1-1을 출력한다. 그렇지 않으면 s(n)s(n)에서 uu의 출현 횟수를 109+710^9 + 7로 나눈 나머지와, s(n)s(n)에서 같은 출현 횟수를 갖는 서로 다른 문자열 vv의 개수를 109+710^9 + 7로 나눈 나머지를 차례로 두 정수로 출력한다.

예제1

  1. 예제 1

    입력
    4
    10
    a
    10
    abba
    5
    abbabaabbaababbabaababbaabbabaab
    20
    ababab
    
    예상 출력
    512 2
    171 4
    1 344
    -1