水以下コンテスト
コンテスト日時
2024/03/30 (Sa) 14:00 - 17:05

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>

部分点

以下の条件を満たすテストケースにすべて正解したとき、記載された点数が与えられる。

  1. (20点) $K = 1, ~~ S$ に *, ^ は含まれない。
  2. (20点) $K \leq 10^4, ~~ S$ に ^ は含まれない。
  3. (30点) $K \leq 10^4$
  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

累乗 ^ は足し算 + や掛け算 * よりも先に計算してください。

提出
C++23 (g++ 12.2.0)