https://atcoder.jp/contests/abc220/tasks/abc220_d
設f[i][j]表示拿出要操作的數之後剩餘長度爲i,在序列外的數爲j的方案數,進行記憶化搜索。
注意因爲f[i][j]中可能存0,所以f[][]之前沒有搜索過的標誌不能爲f[i][j]=0,應該將f[i][j]初始化爲-1,否則相當於對f[i][j]=0的情況並沒有記憶化,會TLE。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=998244353;
int n;
int j;
int a[100005];
int f[100005][10];
int dfs(int len,int x){
if(f[len][x]!=-1) return f[len][x];
if(len==0) return f[len][x]=(x==j);
int tmp=a[n-len+1];
return f[len][x]=(dfs(len-1,(x+tmp)%10)+dfs(len-1,(x*tmp)%10))%mod;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=9;i++){
j=i;
memset(f,-1,sizeof(f));
printf("%d\n",(dfs(n-2,(a[1]+a[2])%10)+dfs(n-2,(a[1]*a[2])%10))%mod);
}
return 0;
}