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

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

비트 생성기

시간 제한3초메모리 제한64 MB

요약
정수 상태를 floor 연산과 나머지로 갱신하는 난수 생성기가 주어진 길이 n의 비트열을 정확히 출력하게 하는 초기 상태의 개수를 센다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

어떤 유사난수 비트 생성기는 0≤z<m0 \le z < m 범위의 정수 상태 zz를 유지한다. 기계를 켜면 상태는 [0,m−1][0, m-1] 범위의 어떤 정수로 설정되며, 이 초기값을 시드(seed)라고 부른다. 비트를 하나 요청할 때마다 생성기는 먼저 상태를 갱신한 뒤 비트를 반환한다. 세 개의 정수 상수 aa, cc, kk를 사용한다.

z := floor((z * a + c) / k) mod m
if z < floor(m / 2):
    return 0
else:
    return 1

생성기를 nn번 호출하여 비트열 b1,b2,…,bnb_1, b_2, \ldots, b_n을 얻었다. 상수들과 이 비트열이 주어질 때, 정확히 이 비트열을 만들어 낼 수 있는 시드가 몇 개인지 구하여라.

입력

첫째 줄에 다섯 정수 aa, cc, kk, mm, nn이 주어진다. (0≤a,c<m0 \le a, c < m, 1≤k<m1 \le k < m, 2≤m≤1062 \le m \le 10^6, 1≤n≤1051 \le n \le 10^5)

둘째 줄에 0 또는 1로 이루어진 길이 nn의 문자열이 주어진다. ii번째 문자가 비트 bib_i이다.

출력

0≤z<m0 \le z < m 범위의 정수 중, 초기 상태(시드)로서 정확히 주어진 비트열을 생성할 수 있는 값의 개수를 정수 하나로 출력한다.

예제4

  1. 예제 1

    입력
    3 6 2 9 2
    10
    
    예상 출력
    4
    
  2. 예제 2

    입력
    1 0 1 4 1
    1
    
    예상 출력
    2
    
  3. 예제 3

    입력
    1 0 1 4 1
    0
    
    예상 출력
    2
    
  4. 예제 4

    입력
    3 6 2 9 3
    101
    
    예상 출력
    2