괄호 문자열 Batch
Time limit | Memory limit | # of submissions | # of submitted users | Solved # | Accepted user ratio |
---|---|---|---|---|---|
10000 ms | 512 MiB | 44 | 4 | 1 | 25.00% |
'(
'와 ')
'로만 이루어진 문자열들을 괄호 문자열이라 하는데 괄호 문자열 중에서도 올바른 괄호 문자열은 아래와 같이 정의된다.
- 빈 문자열은 올바른 괄호 문자열이다.
- 문자열
S
가 올바른 괄호 문자열이면(S)
도 올바른 괄호 문자열이다. - 문자열
S
와T
가 올바른 괄호 문자열이면ST
도 올바른 괄호 문자열이다.
올바른 괄호 문자열이 아닌 괄호 문자열들은 올바르지 않은 괄호 문자열이라고 한다. 올바른 괄호 문자열의 예로는 "(())()
", "()()()
", "(()())
” 등이 있고, 올바르지 않은 괄호 문자열의 예로는 "())(()
", "(
", "(()()()
" 등이 있다.
어떤 문자열 S
가 주기성이 있는 문자열이라는 것은 문자열 S
의 비어 있지 않은 접두사 u
가 동시에 S
의 접미사일 때가 있음을 뜻한다. 주기성이 있는 문자열이 아닌 문자열들은 주기성이 없는 문자열이라고 한다. 주기성이 있는 문자열의 예로는 "abcabcab
", "()(
", "aaaaaa
" 등이 있고, 주기성이 없는 문자열의 예로는 "abcd
", "(())()
", "a
" 등이 있다. 각각 두 번째로 들었던 예는 주기성이 있는 괄호 문자열과 주기성이 없는 괄호 문자열이라고 할 수 있다.
길이가 $L$인 괄호 문자열들 중에서 주어진 조건을 만족하는 개수를 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 네 정수 $p$, $q$, $m$, $Q$ ($0 \le p, q \le 1$, $1 \le m \le 10^{6}$, $1 \le Q \le 10^{5}$)이 공백을 사이로 두고 차례대로 주어진다.
다음 $Q$개의 각 줄에는 하나의 자연수 $L$ ($1 \le L \le 10^{6}$)이 주어진다. 앞으로 길이가 $L$인 모든 괄호 문자열의 집합을 $A_{L}$, 길이가 $L$인 올바르지 않은 괄호 문자열의 집합을 $B_{L}$, 길이가 $L$인 주기성이 없는 괄호 문자열의 집합을 $C_{L}$이라고 하자. 주어지는 각 $L$마다 $p = 0$이면 $P = A_{L}$, $p = 1$이면 $P = B_{L}$이고, $q = 0$이면 $Q = A_{L}$, $q = 1$이면 $Q = C_{L}$이다. 여러분은 의 크기를 $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
입력
1 0 17 2
4
8
출력
14
4
예제 2
입력
0 1 17 2
4
8
출력
6
6
예제 3
입력
1 1 17 2
4
8
출력
5
12
길이가 4인 괄호 문자열 중에서 올바른 것은 "()()
"과 "(())
"의 두 가지이므로, 올바르지 않은 괄호 문자열의 개수는 16 - 2 = 14개 이다.
그리고 길이가 4인 주기성이 없는 괄호 문자열은 "((()
", "(())
", "()))
", ")(((
", "))((
", ")))(
"의 6개이고, 이 중에서 올바른 괄호 문자열은 "(())
" 하나이므로, 길이가 4인 올바르지 않으면서 주기성도 없는 괄호문자열은 5개이다.