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

B - f(f(f(f(f(x)))))

Ceylon
2
s
1024
MB
100

問題文

正の整数 KK と、xx の多項式 f(x)f(x) が文字列 SS として与えられます。

最初 x=1x = 1 として、次の操作を KK 回繰り返します。

  • xf(x)x \gets f(x) と更新する。

KK 回繰り返した後の xx998998 で割った余りを求めてください。

ここで、SS は次のBNF表記の<expr>シンボルで表されます。

<expr> ::= <term> | <expr> "+" <term>
<term> ::= <factor> | <term> "*" <factor>
<factor> ::= <value> | <value> "^" <number>
<value> ::= <number> | "x"
<number> ::= 1以上10^9未満の整数 ただし先頭の 0 は省略される

記号はそれぞれ以下の意味を表します。

  • x: xx
  • +: 足し算
  • *: 掛け算、ただし足し算 + よりも先に計算される
  • ^: 累乗、ただし足し算 + や掛け算 * よりも先に計算される

たとえば、以下の文字列は上の <expr>シンボルになり得ます。

  • 998244353: 998244353998244353
  • x+1: x+1x+1
  • x*x+2*x+1: x×x+2×x+1x \times x + 2 \times x + 1
  • 123+456*x^789: 123+456×x789123+456 \times x^{789}

また、以下の文字列は <expr>シンボルになり得ません。

  • -x
  • 1/2
  • 2x
  • 2^x
  • 2^3^4

制約

  • 1K1018,K1 \leq K \leq 10^{18}, K は整数
  • S100|S| \leq 100
  • SS は問題文のBNF表記における <expr>

部分点

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

  1. (20点) K=1,  SK = 1, ~~ S*, ^ は含まれない。
  2. (20点) K104,  SK \leq 10^4, ~~ S^ は含まれない。
  3. (30点) K104K \leq 10^4
  4. (30点) 追加の制約なし

入力

入力は、以下の形式で標準入力から与えられる。

KK
SS

出力

答えを 998998 で割った余りを1行で出力せよ。

入力例 1
1 x+1+2+3
出力例 1
7

f(1)=1+1+2+3=7f(1) = 1 + 1 + 2 + 3 = 7 です。

入力例 2
5 2*x*x+1
出力例 2
843

xx は、次のように変化します。

  • x=1x = 1 です。 f(1)=2×1×1+1=3f(1) = 2 \times 1 \times 1 + 1 = 3 なので、 x3x \gets 3 と更新します。
  • x=3x = 3 です。 f(2)=2×3×3+1=19f(2) = 2 \times 3 \times 3 + 1 = 19 なので、 x19x \gets 19 と更新します。
  • x=19x = 19 です。 f(19)=2×19×19+1=723f(19) = 2 \times 19 \times 19 + 1 = 723 なので、 x723x \gets 723 と更新します。
  • x=723x = 723 です。 f(723)=2×723×723+1=1045459f(723) = 2 \times 723 \times 723 + 1 = 1045459 なので、 x1045459x \gets 1045459 と更新します。
  • x=1045459x = 1045459 です。 f(1045459)=2×1045459×1045459+1=2185969041363f(1045459) = 2 \times 1045459 \times 1045459 + 1 = 2185969041363 なので、 x2185969041363x \gets 2185969041363 と更新します。

これより、操作を 55 回繰り返した後の xx21859690413632185969041363 です。
よって、これを 998998 で割ったあまりである 843843 が答えとなります。

入力例 3
5 2*x^2+1
出力例 3
843

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