Official

F - 式の評価/Evaluate Formula Editorial by yuto1115

解説

以下のようなアルゴリズムによって解くことができます。

  • 変数 \(\text{ans},\text{now}\) を用意し \(\text{ans}=1,\text{now}=0\) と初期化する。
  • \(S\) の各文字を左から順に見ていって、それぞれの文字について以下を行う。
    • 今見ている文字が * である場合:\(\text{ans}\)\(\text{now}\) をかけ、\(\text{now}\)\(0\) に戻す。
    • 今見ている文字が数字である場合:\(\text{now}\) の一番下の桁に今見ている数字を追加する。例えば、\(\text{now}=10\) であり今見ている文字が 2 ならば、\(\text{now}\leftarrow102\) と更新する。

\(\text{now}\) の一番下の桁に今見ている数字を追加する」という操作についてですが、これは \(\text{now}\)\(10\) をかけた上で今見ている数字を \(\text{now}\) に足すことで簡単に実装できます。なお、\(\text{ans},\text{now}\) は非常に大きくなることがあるため、適宜 \(998244353\) で割った余りをとる必要があることに注意してください。

実装例 (C++) :

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

const int mod = 998244353;

int main() {
    string s;
    cin >> s;
    ll ans = 1, now = 0;
    for (char c: s) {
        if (c == '*') {
            ans *= now;
            ans %= mod;
            now = 0;
        } else {
            now *= 10;
            now += c - '0';
            now %= mod;
        }
    }
    ans *= now;
    ans %= mod;
    cout << ans << endl;
}

posted:
last update: