题目描述

你有一个长度为n的数字串。定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导0),将他们加起来,求f,并求和。比如g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123)。已知字符串和m后求答案对998244353(7*17*223+1,一个质数)取模后的值。

输入输出格式

输入格式:

第一行输入一个字符串,第二行输入m

输出格式:

仅输出一个数表示答案

输入输出样例

输入样例#1:
复制

123
3
输出样例#1: 复制

394608467

说明

对于100%的数据,字符串长度不超过500,m<=5

先求出$f[s]$

显然$f[i]=\sum_{j=i-m}^{i-1}f[j]$

如果i特别大就可以用一个m*m的转移矩阵

也就是$(f_{i-m+1},f_{i-m+2},...f_{i})$的转移矩阵

预处理出A[i][j]表示数S为j*10^i的转移矩阵

对于$g$的转移:

显然$g[i]=\sum_{j=0}^{i-1}g[j]*D[j+1][i]$

$D[j+1][i]$表示j+1~i位构成的数的转移矩阵,显然可以通过A推出

g也要用一个矩阵表示

g[0]初始矩阵使$g_0=1$,也就是$(0,0,..,0,1)$

最后输出矩阵中代表$g_n$的方案,位置是(1,m)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int Mod=;
struct Matrix
{
int a[][];
}f[],A[][],now;
char s[];
int n,m,ans;
Matrix operator *(const Matrix &a,const Matrix &b)
{
int i,j,l;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=; i<=m; i++)
{
for (j=; j<=m; j++)
{
for (l=; l<=m; l++)
{
res.a[i][j]+=1ll*a.a[i][l]*b.a[l][j]%Mod;
    if (res.a[i][j]>=Mod)
    res.a[i][j]-=Mod;
}
}
}
return res;
}
Matrix operator +(const Matrix &a,const Matrix &b)
{
int i,j,l;
Matrix res;
memset(res.a,,sizeof(res.a));
for (i=; i<=m; i++)
{
for (j=; j<=m; j++)
{
  res.a[i][j]=(a.a[i][j]+b.a[i][j])%Mod;
}
}
return res;
}
int main()
{int i,j;
cin>>s+;
n=strlen(s+);
cin>>m;
for (i=;i<=m;i++)
{
A[][].a[i][i]=;
}
for (i=;i<=m;i++)
{
A[][].a[i][m]=;
}
for (i=;i<m;i++)
{
A[][].a[i+][i]=;
}
for (i=;i<=;i++)
{
A[][i]=A[][i-]*A[][];
}
for (i=;i<=n;i++)
{
A[i][]=A[][];
A[i][]=A[i-][]*A[i-][];
for (j=;j<=;j++)
  {
  A[i][j]=A[i][j-]*A[i][];
  }
}
f[].a[][m]=;
for (i=;i<=n;i++)
{
now=A[][s[i]-''];
for (j=i-;j>=;j--)
  {
  f[i]=f[i]+(f[j]*now);
  if (j) now=A[i-j][s[j]-'']*now;
  }
}
ans=f[n].a[][m];
cout<<ans;
}

[HAOI2015]数字串拆分的更多相关文章

  1. BZOJ4037:[HAOI2015]数字串拆分——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4037 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时 ...

  2. bzoj4037 [HAOI2015]数字串拆分

    Description 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导 ...

  3. 洛谷3176 [HAOI2015]数字串拆分 (矩阵乘法+dp)

    qwq真的是一道好题qwq自己做基本是必不可能做出来的. 首先,如果这个题目只是求一个\(f\)数组的话,那就是一道裸题. 首先,根据样例 根据题目描述,我们能发现其实同样数字的不同排列,也是属于不同 ...

  4. BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划

    拆分的情况下,发现f数组本身并不是很好递推. 因为f(123)=f(123)/f(12+3)/f(1+2+3). 然后考虑f可以怎么表示f(n)=a0*M^n M为转移矩阵. 然后发现 f(x+y)= ...

  5. bzoj 4037: [HAOI2015]数字串拆分【dp+矩阵加速】

    首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式 ...

  6. loj#2128. 「HAOI2015」数字串拆分 矩阵乘法

    目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...

  7. 【LOJ】#2128. 「HAOI2015」数字串拆分

    题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...

  8. 解决 PHPExcel 长数字串显示为科学计数

    解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...

  9. Openjudge 1.13-40 提取数字串按数值排序

    40:提取数字串按数值排序 查看 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个字符串,请将其中的所有数字串提取,并将每个数字串作为整数看待(假设可以用int 表示),按从 ...

随机推荐

  1. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  2. vim配置之taglist插件安装

    上次说了不带插件的vim配置,今天补充两个,来日方长,不定期更新: 首先看一个路径: 下载ctags,将其中的ctags.exe复制到上边目录下边: 地址:https://sourceforge.ne ...

  3. python的测试

    测试 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 实验步骤 1. 应该测试什么? 如果可能的话,代码库中的所有代码都要测 ...

  4. 201621123031 《Java程序设计》第2周学习总结

    Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...

  5. 【译】Gradle 的依赖关系处理不当,可能导致你编译异常

    文章 | Ashesh Bharadwaj 翻译 | 承香墨影 授权 承香墨影 翻译.编辑并发布 在 Android Studio 中,Gradle 构建过程对于开发者来说,很大程度上是抽象的.作为一 ...

  6. js判断flash文件是否加载完毕

    轮询判断加载进度 img的加载完成有onload方法,一直不知道该怎么判断swf文件是否加载完毕了? 在应用中使用了轮询判断加载进度值PercentLoaded是否达到100,经测试,可以达到效果. ...

  7. Java 持久化操作之 --io流与序列化

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  8. php类中的$this,static,const,self这几个关键字使用方法

    本篇文章主要分享一下关于php类中的$this,static,final,const,self这几个关键字使用方法 $this $this表示当前实例,在类的内部方法访问未声明为const及stati ...

  9. Python内置函数(40)——dir

    英文文档: dir([object]) Without arguments, return the list of names in the current local scope. With an ...

  10. GIT入门笔记(16)- 分支创建和管理

    查看分支:git branch创建分支:git branch <name>切换分支:git checkout <name>创建+切换分支:git checkout -b < ...