这题是简单的dp,把每种数字组合看成一个个小的部分。
#include<iostream> using namespace std; const long long mod=998244353; long long s[500000]; long long dp[200000][10]; long long find(long long x){ //计算数跟 while(x>=10){ long long y=x%10; x/=10; x+=y; } return x; } int main(){ int t; cin>>t; // cout<<find(t)<<endl; for(int i=1;i<=t;i++){ cin>>s[i]; } dp[0][0]=1; for(int i=1;i<=t;i++){ for(int j=0;j<=9;j++){ //模拟加上各种的可能性 dp[i][j]=(dp[i][j]+dp[i-1][j])%mod; //继承上一个到达这个数的数量 (dp[i][find(j+s[i])]+=dp[i-1][j])%=mod; //加完之后得到数的数量增加,之前有多少个这样的数 } } for(int i=1;i<=9;i++){ cout<<dp[t][i]<<" "; } return 0; }