Time Limit: 2 sec / Memory Limit: 1024 MB
配点: 点
問題文
この問題では,じゃんけんの手「グー」「チョキ」「パー」をそれぞれ で表す. は に勝ち, は に勝ち, は に勝つ.
をじゃんけんの手とするとき, を以下のように定める (これらは通常の意味での足し算・引き算・掛け算ではない):
- は, のとき と のうち勝つ方とし, のとき とする.
- は, のとき と のうち負ける方とし, のとき とする.
- は, のとき のうち でも でもないものとし, のとき とする.
じゃんけんの手と と括弧からなる式は,以下のように計算する:
- 括弧の中は先に計算する.例えば, である.
- 括弧の深さが同じ部分については,
- より の方を優先して計算する.例えば, である.
- 同じ優先順位のもの ( どうし, どうし, と , どうし) については,左から順番に計算する.例えば, である.
JOI さんはあるじゃんけんの式を持っていたが,その式の中の の一部が見えなくなってしまった.見えなくなってしまった部分が ?
で表された長さ の文字列 が与えられる.JOI さんは,見えなくなってしまった部分のそれぞれに のいずれかを割り当てる方法であって,式の計算結果が になるものが何通りあるかを知りたい.その数は非常に大きくなる可能性があるので, で割った余りを求めたい.
本問で用いられる文法は,BNF (バッカス・ナウア記法) を用いて以下のように表される.じゃんけんの式の一部が見えなくなってしまったものは <expression> である.
<expression> ::= <term> | <expression> "+" <term> | <expression> "-" <term> <term> ::= <factor> | <term> "*" <factor> <factor> ::= "R" | "S" | "P" | "?" | "(" <expression> ")"
これは例えば,ある文字列が <expression> であるとは,「<term> である」または「<expression> である文字列,+
,<term> である文字列,をこの順に連結させたもの」または「<expression> である文字列,-
,<term> である文字列,をこの順に連結させたもの」であることである,というように再帰的に定義されることを意味する.
<expression> である文字列 と計算結果 が与えられるので,?
に のいずれかを割り当てる方法であって式の計算結果が になるものの個数を で割った余りを求めるプログラムを作成せよ.
制約
- .
- は長さ の文字列である.
- は問題文で定められた <expression> である.
- は
R
またはS
またはP
である.
小課題
- ( 点) .
- ( 点) .
- ( 点) 追加の制約はない.
入力
入力は以下の形式で標準入力から与えられる.
出力
標準出力に,?
に のいずれかを割り当てる方法であって式の計算結果が になるものの個数を で割った余りを 行で出力せよ.
入力例 1Copy
11 S+?-(R+?)*P S
出力例 1Copy
6
箇所の ?
に のいずれかを割り当てて計算結果を にする方法は,以下の 通りがある:
入力例 2Copy
15 ?+?-?*?+?-?*?+? R
出力例 2Copy
2187
入力例 3Copy
13 (((((R)))))+? P
出力例 3Copy
1
入力例 4Copy
1 P S
出力例 4Copy
0
入力例 5Copy
27 R+((?+S-?*P+?)-P*?+S-?)*R+? P
出力例 5Copy
381
入力例 6Copy
83 ((R+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?))-((S+?)*(?+?))*((?+?)*(?+?))*((?+?)*(?+?)) P
出力例 6Copy
460353133
条件を満たす割り当て方は 通りあるため,それを で割った余りである を出力する.