JZYZOJ 1542 [haoi2015]str 矩阵乘法 dp
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZYZOJ 1542 [haoi2015]str 矩阵乘法 dp相关的知识,希望对你有一定的参考价值。
http://172.20.6.3/Problem_Show.asp?id=1542
dp+矩阵乘法思路hin好想,对于我这种题目稍微学术就几乎什么也不会的人来说唯一的难点在于读题,因为一心想着划水题目没有看清楚,样例wa了一会最后仔细读题发现自己g的操作看错了,非常智障了
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=510; 8 const long long modn=998244353; 9 char ch[maxn]; 10 int m,n; 11 struct mat{ 12 long long e[7][7]; 13 mat(){memset(e,0,sizeof(e));} 14 void cle(){ 15 for(int i=1;i<=m;i++)e[i][i]=1; 16 } 17 };mat ten[20],f[maxn][maxn],g[maxn]; 18 mat mul(mat x,mat y){ 19 mat z; 20 for(int i=1;i<=m;i++){ 21 for(int j=1;j<=m;j++){ 22 for(int k=1;k<=m;k++){ 23 z.e[i][j]+=x.e[i][k]*y.e[k][j]; 24 z.e[i][j]%=modn; 25 } 26 } 27 } 28 return z; 29 } 30 mat plu(mat x,mat y){ 31 mat z; 32 for(int i=1;i<=m;i++){ 33 for(int j=1;j<=m;j++){ 34 z.e[i][j]=x.e[i][j]+y.e[i][j]; 35 z.e[i][j]%=modn; 36 } 37 } 38 return z; 39 } 40 mat pow(mat x,long long k){ 41 mat z;z.cle(); 42 while(k){ 43 if(k&1)z=mul(x,z); 44 k/=2;x=mul(x,x); 45 } 46 return z; 47 } 48 int main(){ 49 scanf("%s%d",&ch,&m);n=strlen(ch); 50 ten[0].cle(); 51 for(int i=1;i<m;i++)ten[1].e[i][i+1]=1; 52 for(int i=1;i<=m;i++)ten[1].e[m][i]=1; 53 for(int i=2;i<=9;i++)ten[i]=pow(ten[1],i); 54 for(int i=n;i>=1;i--){ 55 f[i][i-1].cle(); 56 for(int j=i;j<=n;j++){ 57 int z=ch[j-1]-‘0‘; 58 f[i][j]=mul(pow(f[i][j-1],10),ten[z]); 59 } 60 }g[n+1].cle(); 61 for(int i=n;i>=1;i--){ 62 for(int j=i;j<=n;j++){ 63 g[i]=plu(g[i],mul(g[j+1],f[i][j])); 64 } 65 } 66 printf("%I64d\n",g[1].e[m][m]); 67 return 0; 68 }
以上是关于JZYZOJ 1542 [haoi2015]str 矩阵乘法 dp的主要内容,如果未能解决你的问题,请参考以下文章
JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块