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: