문제 보기 - 괄호 문자열 (kriii3_R)

시간 제한 메모리 제한 제출 횟수 통과한 사람 수 비율
10000 ms 512 MiB 44 1 2.27%

'('와 ')'로만 이루어진 문자열들을 괄호 문자열이라 하는데 괄호 문자열 중에서도 올바른 괄호 문자열은 아래와 같이 정의된다.

  1. 빈 문자열은 올바른 괄호 문자열이다.
  2. 문자열 S가 올바른 괄호 문자열이면 (S)도 올바른 괄호 문자열이다.
  3. 문자열 ST가 올바른 괄호 문자열이면 ST도 올바른 괄호 문자열이다.

올바른 괄호 문자열이 아닌 괄호 문자열들은 올바르지 않은 괄호 문자열이라고 한다. 올바른 괄호 문자열의 예로는 "(())()", "()()()", "(()())” 등이 있고, 올바르지 않은 괄호 문자열의 예로는 "())(()", "(", "(()()()" 등이 있다.

어떤 문자열 S주기성이 있는 문자열이라는 것은 문자열 S의 비어 있지 않은 접두사 u가 동시에 S의 접미사일 때가 있음을 뜻한다. 주기성이 있는 문자열이 아닌 문자열들은 주기성이 없는 문자열이라고 한다. 주기성이 있는 문자열의 예로는 "abcabcab", "()(", "aaaaaa" 등이 있고, 주기성이 없는 문자열의 예로는 "abcd", "(())()", "a" 등이 있다. 각각 두 번째로 들었던 예는 주기성이 있는 괄호 문자열과 주기성이 없는 괄호 문자열이라고 할 수 있다.

길이가 L인 괄호 문자열들 중에서 주어진 조건을 만족하는 개수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 네 정수 p, q, m, Q (0 ≤ p, q ≤ 1, 1 ≤ m ≤ 106, 1 ≤ Q ≤ 105)이 공백을 사이로 두고 차례대로 주어진다.

다음 Q개의 각 줄에는 하나의 자연수 L (1 ≤ L ≤ 106)이 주어진다. 앞으로 길이가 L인 모든 괄호 문자열의 집합을 AL, 길이가 L인 올바르지 않은 괄호 문자열의 집합을 BL, 길이가 L인 주기성이 없는 괄호 문자열의 집합을 CL이라고 하자. 주어지는 각 L마다 p = 0이면 P = AL, p = 1이면 P = BL이고, q = 0이면 Q = AL, q = 1이면 Q = CL이다. 여러분은 의 크기를 m으로 나눈 나머지를 출력해야 한다.

p = 1, q = 0이면 길이가 L인 올바르지 않은 괄호 문자열의 개수를, p = 0, q = 1이면 길이가 L인 주기성이 없는 괄호 문자열의 개수를, p = 1, q = 1이면 길이가 L인 올바르지 않으면서 주기성도 없는 괄호 문자열의 개수를 구하면 된다.

출력

Q개의 줄에 걸쳐서 입력에서 정의한 대로 의 크기를 m으로 나눈 나머지를 출력하면 된다.

부분 문제

부분문제 점수 p q
1 38 1 0
2 35 0 1
3 40 1 1

입출력 예제

입력 예시 출력 예시
1 0 17 2
4
8
14
4
0 1 17 2
4
8
6
6
1 1 17 2
4
8
5
12

길이가 4인 괄호 문자열 중에서 올바른 것은 "()()"과 "(())"의 두 가지이므로, 올바르지 않은 괄호 문자열의 개수는 16 - 2 = 14개 이다.

그리고 길이가 4인 주기성이 없는 괄호 문자열은 "((()", "(())", "()))", ")(((", "))((", ")))("의 6개이고, 이 중에서 올바른 괄호 문자열은 "(())" 하나이므로, 길이가 4인 올바르지 않으면서 주기성도 없는 괄호문자열은 5개이다.