题意:给一个N长度只有0到9的序列,做以下两个操作F:将(x+y)%10 G:将(x*y)%10
(x和y是序列最前面的两个数),将结果放入序列最前面,直到只剩下一个数。算出每个数剩下的可能个数。
解法:dp 由于序列是固定的(作为y),所以dp枚举0到9所有数(作为x),将F和G的结果加入下一层,即可。
#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, a[N][12],b[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
memset(a, 0, sizeof a);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> b[i];
}
a[0][b[0]] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < 10; j++) {
int k = (b[i] + j) % 10;
a[i][k] += a[i - 1][j] ;
a[i][k] %= 998244353;
k = (b[i] * j) % 10;
a[i][k] += a[i - 1][j] ;
a[i][k] %= 998244353;
}
}
for (int i = 0; i < 10; i++)cout << a[n - 1][i] << endl;
return 0;
}