(와 )로만 이루어진 문자열을 괄호 문자열이라고 한다. 괄호 문자열 가운데 올바른 괄호 문자열은 다음과 같이 정의한다.
올바른 괄호 문자열이 아닌 괄호 문자열은 올바르지 않은 괄호 문자열이라고 한다. (())(), ()()(), (()())는 올바른 괄호 문자열이고, ())((), (, (()()()는 올바르지 않은 괄호 문자열이다.
문자열 S의 접두사 가운데 비어 있지 않고 S 자신도 아닌 것이 S의 접미사와 같으면, S를 주기성이 있는 문자열이라고 한다. 그런 접두사가 하나도 없는 문자열은 주기성이 없는 문자열이다. abcabcab, ()(, aaaaaa는 주기성이 있는 문자열이고, abcd, (())(), a는 주기성이 없는 문자열이다.
길이가 L인 괄호 문자열 가운데 주어진 조건을 만족하는 것이 몇 개인지 세는 프로그램을 작성하시오.
첫째 줄에 네 정수 p, q, m, Q가 공백을 사이에 두고 주어진다. (0≤p≤1, 0≤q≤1, 1≤m≤106, 1≤Q≤105)
이어지는 Q개의 줄에 자연수 L이 한 줄에 하나씩 주어진다. (1≤L≤106)
길이가 L인 모든 괄호 문자열의 집합을 AL, 길이가 L인 올바르지 않은 괄호 문자열의 집합을 BL, 길이가 L인 주기성이 없는 괄호 문자열의 집합을 CL이라고 하자. p=0이면 P=AL, p=1이면 P=BL이고, q=0이면 R=AL, q=1이면 R=CL이다.
정리하면 p=0, q=0일 때는 길이가 L인 괄호 문자열의 개수를, p=1, q=0일 때는 올바르지 않은 괄호 문자열의 개수를, p=0, q=1일 때는 주기성이 없는 괄호 문자열의 개수를, p=1, q=1일 때는 올바르지 않으면서 주기성도 없는 괄호 문자열의 개수를 세면 된다.
각 L마다 ∣P∩R∣을 m으로 나눈 나머지를 한 줄에 하나씩 출력한다. 입력에 주어진 순서대로 Q개의 줄을 출력한다.
길이가 4인 괄호 문자열 가운데 올바른 것은 ()()과 (()) 두 가지이므로, 올바르지 않은 것은 16−2=14개다. 길이가 4이면서 주기성이 없는 괄호 문자열은 (((), (()), ())), )(((, ))((, )))( 여섯 개이고 그중 올바른 것은 (()) 하나뿐이므로, 길이가 4이면서 올바르지 않고 주기성도 없는 괄호 문자열은 5개다.