B - f(f(f(f(f(x)))))
Ceylon
2
s
1024
MB
100
点
問題文
正の整数 $K$ と、$x$ の多項式 $f(x)$ が文字列 $S$ として与えられます。
最初 $x = 1$ として、次の操作を $K$ 回繰り返します。
- $x \gets f(x)$ と更新する。
$K$ 回繰り返した後の $x$ を $998$ で割った余りを求めてください。
ここで、$S$ は次のBNF表記の<expr>
シンボルで表されます。
<expr> ::= <term> | <expr> "+" <term>
<term> ::= <factor> | <term> "*" <factor>
<factor> ::= <value> | <value> "^" <number>
<value> ::= <number> | "x"
<number> ::= 1以上10^9未満の整数 ただし先頭の 0 は省略される
記号はそれぞれ以下の意味を表します。
x
: $x$+
: 足し算*
: 掛け算、ただし足し算+
よりも先に計算される^
: 累乗、ただし足し算+
や掛け算*
よりも先に計算される
たとえば、以下の文字列は上の <expr>
シンボルになり得ます。
998244353
: $998244353$x+1
: $x+1$x*x+2*x+1
: $x \times x + 2 \times x + 1$123+456*x^789
: $123+456 \times x^{789}$
また、以下の文字列は <expr>
シンボルになり得ません。
-x
1/2
2x
2^x
2^3^4
制約
- $1 \leq K \leq 10^{18}, K$ は整数
- $|S| \leq 100$
- $S$ は問題文のBNF表記における
<expr>
部分点
以下の条件を満たすテストケースにすべて正解したとき、記載された点数が与えられる。
- (20点) $K = 1, ~~ S$ に
*
,^
は含まれない。 - (20点) $K \leq 10^4, ~~ S$ に
^
は含まれない。 - (30点) $K \leq 10^4$
- (30点) 追加の制約なし
入力
入力は、以下の形式で標準入力から与えられる。
$K$
$S$
出力
答えを $998$ で割った余りを1行で出力せよ。
入力例 1
1
x+1+2+3
出力例 1
7
$f(1) = 1 + 1 + 2 + 3 = 7$ です。
入力例 2
5
2*x*x+1
出力例 2
843
$x$ は、次のように変化します。
- $x = 1$ です。 $f(1) = 2 \times 1 \times 1 + 1 = 3$ なので、 $x \gets 3$ と更新します。
- $x = 3$ です。 $f(2) = 2 \times 3 \times 3 + 1 = 19$ なので、 $x \gets 19$ と更新します。
- $x = 19$ です。 $f(19) = 2 \times 19 \times 19 + 1 = 723$ なので、 $x \gets 723$ と更新します。
- $x = 723$ です。 $f(723) = 2 \times 723 \times 723 + 1 = 1045459$ なので、 $x \gets 1045459$ と更新します。
- $x = 1045459$ です。 $f(1045459) = 2 \times 1045459 \times 1045459 + 1 = 2185969041363$ なので、 $x \gets 2185969041363$ と更新します。
これより、操作を $5$ 回繰り返した後の $x$ は $2185969041363$ です。
よって、これを $998$ で割ったあまりである $843$ が答えとなります。
入力例 3
5
2*x^2+1
出力例 3
843
累乗 ^
は足し算 +
や掛け算 *
よりも先に計算してください。