• 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
    ",g[1].e[m][m]);
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    字符串操作函数5!!
    字符串操作函数4
    字符串操作函数3
    java开发命名规范总结
    centerOS网络NAT和桥接
    input框的内容变化监听
    Xunsearch迅搜项目实战经验
    PHP网络爬虫之CURL学习
    Xunsearch的使用总结
    Xshell 5 过期
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7788233.html
Copyright © 2020-2023  润新知