#1431
Platinum IV

가위바위보 식

서브테스크
원문: 日本語
시간 제한
2s
메모리 제한
1024MB
제출
0
정답
0
맞힌 사람
0
정답 비율
0.0%

문제

이 문제에서는, 가위바위보의 수 「바위」 「가위」 「보」 를 각각 R, S, P 로 나타낸다. R 은 S 를 이기고, S 는 P 를 이기고, P 는 R 을 이긴다.

x,yx, y 를 가위바위보의 수라고 할 때, x+y,xy,xyx + y,\,\, x - y,\,\, x * y 를 다음과 같이 정한다 (이것들은 통상적인 의미에서의 덧셈·뺄셈·곱셈이 아니다):

  • x+yx + y 는, xyx \neq y 일 때 xxyy 중 이기는 쪽으로 하고, x=yx = y 일 때 xx 로 한다.
  • xyx - y 는, xyx \neq y 일 때 xxyy 중 지는 쪽으로 하고, x=yx = y 일 때 xx 로 한다.
  • xyx * y 는, xyx \neq y 일 때 R, S, P 중 xxyy 도 아닌 것으로 하고, x=yx = y 일 때 xx 로 한다.

가위바위보의 수와 +,,+, -, * 와 괄호로 이루어진 식은, 다음과 같이 계산한다:

  • 괄호 안을 먼저 계산한다. 예를 들어, R * (P + S) = R * S = P 이다.
  • 괄호의 깊이가 같은 부분에 대해서는, +,+, - 보다 * 를 우선하여 계산한다. 예를 들어, R - P * S = R - (P * S) = R - R = R 이다. 우선순위가 같은 것 (++ 끼리, - 끼리, ++-, * 끼리) 에 대해서는, 왼쪽부터 순서대로 계산한다. 예를 들어, R - P + S = (R - P) + S = R + S = R 이다.

JOI 씨는 어떤 가위바위보 식을 가지고 있었는데, 그 식 안의 R, S, P 의 일부가 보이지 않게 되어 버렸다. 보이지 않게 된 부분이 `?' 로 표시된 길이 NN 의 문자열 EE 가 주어진다. JOI 씨는, 보이지 않게 된 부분 각각에 R, S, P 중 하나를 할당하는 방법으로서 식의 계산 결과가 AA 가 되는 것이 몇 가지인지 알고 싶다. 그 수는 매우 커질 가능성이 있으므로, 10000000071 000 000 007 로 나눈 나머지를 구하고자 한다.

본 문제에서 사용되는 문법은, BNF (배커스-나우어 표기법) 를 사용하여 다음과 같이 표현된다. 가위바위보 식의 일부가 보이지 않게 된 것은 이다.

::= | "+" | "-" ::= | "*" ::= "R" | "S" | "P" | "?" | "(" ")"

이것은 예를 들어, 어떤 문자열이 이라는 것은, 「 이다」 또는 「 인 문자열, +', <term> 인 문자열, 을 이 순서로 연결한 것」 또는 「<expression> 인 문자열, -', 인 문자열, 을 이 순서로 연결한 것」 이라는 것이다, 와 같이 재귀적으로 정의됨을 의미한다.

인 문자열 EE 와 계산 결과 AA 가 주어질 때, `?' 에 R, S, P 중 하나를 할당하는 방법으로서 식의 계산 결과가 AA 가 되는 것의 개수를 10000000071 000 000 007 로 나눈 나머지를 구하는 프로그램을 작성하시오.

제한

  • 1N2000001 \le N \le 200 000.
  • EE 는 길이 NN 의 문자열이다.
  • EE 는 문제문에서 정해진 이다.
  • AAR' 또는 S' 또는 `P' 이다.

서브태스크

  1. (2020 점) N15N \le 15.
  2. (2020 점) N200N \le 200.
  3. (6060 점) 추가 제약이 없다.

입력

입력은 다음 형식으로 표준 입력에서 주어진다.
NN
EE
AA

출력

표준 출력에, `?' 에 R, S, P 중 하나를 할당하는 방법으로서 식의 계산 결과가 AA 가 되는 것의 개수를 10000000071 000 000 007 로 나눈 나머지를 11 줄에 출력한다.

예제 입력 1

11
S+?-(R+?)*P
S

예제 출력 1

6

22 군데의 `?' 에 R, S, P 중 하나를 할당하여 계산 결과를 S 로 만드는 방법은, 다음 66 가지가 있다:

  • S + R - (R + R) * P
  • S + R - (R + S) * P
  • S + S - (R + R) * P
  • S + S - (R + S) * P
  • S + P - (R + R) * P
  • S + P - (R + S) * P

예제 입력 2

15
?+?-?*?+?-?*?+?
R

예제 출력 2

2187

예제 입력 3

13
(((((R)))))+?
P

예제 출력 3

1

예제 입력 4

1
P
S

예제 출력 4

0

예제 입력 5

27
R+((?+S-?*P+?)-P*?+S-?)*R+?
P

예제 출력 5

381

예제 입력 6

83
((R+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?))-((S+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?))
P

예제 출력 6

460353133

조건을 만족하는 할당 방법은 1046035320310 460 353 203 가지이므로, 그것을 10000000071 000 000 007 로 나눈 나머지인 460353133460 353 133 을 출력한다.

코드 제출

코드를 제출하려면 로그인이 필요합니다.

로그인
내 제출

제출 내역이 없습니다.

맞은 사람

아직 맞은 사람이 없습니다.

난이도 투표
Platinum IV1명 투표· 약 22시간 전
로그인 후 AC 받으면 투표할 수 있습니다.
전체 제출

제출 내역이 없습니다.