#include<iostream>
#include<cstdio>
#include<cstring>
#define mo 998244353
#define ll long long
using namespace std;
int n,m,s[1005];char c[1005];
struct Matrix{ll M[7][7];}X,k[15][1005],dp[1005],t;
Matrix operator*(Matrix a,Matrix b)
{
Matrix ans;
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
{
ans.M[i][j]=0;
for (int k=1;k<=m;k++)
ans.M[i][j]+=a.M[i][k]*b.M[k][j];
ans.M[i][j]%=mo;
}
return ans;
}
Matrix operator+(Matrix a,Matrix b)
{
Matrix ans;
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
ans.M[i][j]=(a.M[i][j]+b.M[i][j])%mo;
return ans;
}
Matrix pow(Matrix a,int k)
{
Matrix ans=a;
for (k--;k;k>>=1,a=a*a)
if (k&1) ans=ans*a;
return ans;
}
int main()
{
scanf("%s%d",c,&m);
n=strlen(c);
for (int i=1;i<=n;i++) s[i]=c[i-1]-'0';
for (int i=1;i<=m;i++)
X.M[i][m]=k[0][1].M[i][i]=1;
for (int i=2;i<=m;i++)
X.M[i][i-1]=1;
for (int i=1;i<=9;i++)//k[i][j]:i*10^j
{
k[i][1]=k[i-1][1]*X;
for (int j=2;j<=n;j++)
k[i][j]=pow(k[i][j-1],10);
}
dp[0].M[1][m]=1;
for (int i=1;i<=n;i++)//dp[i]:前i长度的方案数
{
t=k[s[i]][1];
for (int j=i-1;j>=0;j--)
{
dp[i]=dp[i]+dp[j]*t;
if (j&&s[j]) t=t*k[s[j]][i-j+1];
}
}
printf("%lld\n",dp[n].M[1][m]);
return 0;
}
bzoj4037: [HAOI2015]Str
最新推荐文章于 2018-06-11 21:53:22 发布