[HAOI2015]数字串拆分
题目描述
你有一个长度为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
输出格式:
仅输出一个数表示答案
输入输出样例
说明
对于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]数字串拆分的更多相关文章
- BZOJ4037:[HAOI2015]数字串拆分——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4037 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时 ...
- bzoj4037 [HAOI2015]数字串拆分
Description 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导 ...
- 洛谷3176 [HAOI2015]数字串拆分 (矩阵乘法+dp)
qwq真的是一道好题qwq自己做基本是必不可能做出来的. 首先,如果这个题目只是求一个\(f\)数组的话,那就是一道裸题. 首先,根据样例 根据题目描述,我们能发现其实同样数字的不同排列,也是属于不同 ...
- 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)= ...
- bzoj 4037: [HAOI2015]数字串拆分【dp+矩阵加速】
首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式 ...
- loj#2128. 「HAOI2015」数字串拆分 矩阵乘法
目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...
- 【LOJ】#2128. 「HAOI2015」数字串拆分
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...
- 解决 PHPExcel 长数字串显示为科学计数
解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...
- Openjudge 1.13-40 提取数字串按数值排序
40:提取数字串按数值排序 查看 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个字符串,请将其中的所有数字串提取,并将每个数字串作为整数看待(假设可以用int 表示),按从 ...
随机推荐
- linux,windows,ubuntu下git安装与使用
ubuntu下git安装与使用:首先应该检查本地是否已经安装了git ,如果没有安装的话,在命令模式下输入 sudo apt-get install git 进行安装 输入git命令查看安装状态及常用 ...
- 第二次作业之微信小程序
2.1 介绍产品相关信息 你选择的产品是? 微信小程序 为什么选择该产品作为分析? 在等待了1年多以后,小程序终于在今年初上线,即速应用在H5领域的累计,便承接在小程序上.8月7日,即速应用的用户微信 ...
- Beta冲刺-用户测试报告
一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...
- 1013团队Beta冲刺day5
项目进展 李明皇 今天解决的进度 服务器端还未完善,所以无法进行联动调试.对页面样式和逻辑进行优化 明天安排 前后端联动调试 林翔 今天解决的进度 完成维护登录态,实现图片上传,微信开发工具上传图片不 ...
- Lucene 的索引文件锁原理
Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene 环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...
- Flask 学习 十三 应用编程接口
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. REST的六个特性: 客户端-服务器(Client-Server)服务器 ...
- bzoj千题计划251:bzoj3672: [Noi2014]购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...
- 申请JetBrains学生免费注册码
1.申请.edu.*后缀的邮箱 从某个知乎用户上面得到了两个可以申请的后缀edu的邮箱 上海交通大学校友统一身份认证:https://register.alumni.sjtu.edu.cn/alumn ...
- Spring mvc中junit测试遇到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException错误怎么解决
今天遇到图片中的错误,纠结了一下,弄清楚了怎么从控制台中读取错误信息,并修改错误. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ...
- babel基本用法
babel-cli babel-cli是本地使用编译js文件 1.安装: cnpm i babel-cli babel-preset-env -D 2.配置packjson: "script ...