Official

D - FG operation Editorial by sugarrr


配る DP で解きます。

\(dp[i][j]:A_i\) まで操作に関わったとき、数列の先頭が \(j\) であるような操作手順は何通りあるか
とします。

初期値は

  • \(dp[1][j] = 1 (j = A_1)\)
  • \(dp[1][j] = 0 (j \neq A_1)\)

とします。

\(dp[i][j]\) からの遷移は

  • \(dp[i+1][(j+A_{i+1}) \%10]\)
  • \(dp[i+1][(j\times A_{i+1}) \%10]\)

\(2\) つです。

最終的な答えは \(dp[N][K]\) です。

C++ の実装例を示します。

#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;
using mint = modint998244353;

signed main(){
    ll n;cin>>n;
    vector<ll>a(n+1);
    for(ll i=1;i<=n;i++)cin>>a[i];
    mint dp[n+1][10];memset(dp,0,sizeof(dp));
    dp[1][a[1]] = 1;

    for(ll i=1;i<=n-1;i++){
        for(ll j=0;j<=9;j++){
            dp[i+1][(j+a[i+1])%10] += dp[i][j];
            dp[i+1][(j*a[i+1])%10] += dp[i][j];
        }
    }
    for(ll K=0;K<=9;K++){
        cout<<dp[n][K].val()<<endl;
    }
    return 0;
}

posted:
last update: