bzoj4037 [HAOI2015]数字串拆分
Description
Input
第一行输入一个字符串,第二行输入m
Output
仅输出一个数表示答案
Sample Input
3
Sample Output
HINT
对于100%的数据,字符串长度不超过500,m<=5
正解:$dp$+矩阵乘法。
矩阵可以用来$dp$转移。。
设$g[i]$表示$i$的拆分数,那么$g[i]=\sum_{j=0}^{m}g[i-j]$,这显然可以用矩阵表示,设转移矩阵为$A$。
然后我们设$f[i]$表示字符串到$i$的方案数。我们可以发现$A^{a1+a2+...+ak}=A^{a1}*A^{a2}*...*A^{ak}$。
那么我们把$f$也变成矩阵,则$f[i]=\sum_{j=0}^{i-1}f[j]*A^{s[j+1]...s[i]}$,因为矩阵可以加法,满足分配律,所以这里是对的。
预处理出$(A^{10^{r}})^{k}$,然后直接$dp$即可。复杂度$O(m^{3}*n^{2})$。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (998244353) using namespace std; struct data{ int m[][]; }A[][],f[],now; char s[];
int n,m; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void add(data &a,data b){
for (RG int i=;i<=m;++i)
for (RG int j=;j<=m;++j){
a.m[i][j]+=b.m[i][j];
if (a.m[i][j]>=rhl) a.m[i][j]-=rhl;
}
return;
} il data mul(data a,data b){
data c; memset(c.m,,sizeof(c.m));
for (RG int i=;i<=m;++i)
for (RG int j=;j<=m;++j)
for (RG int k=;k<=m;++k)
c.m[i][k]=(1LL*a.m[i][j]*b.m[j][k]+c.m[i][k])%rhl;
return c;
} int main(){
#ifndef ONLINE_JUDGE
freopen("split.in","r",stdin);
freopen("split.out","w",stdout);
#endif
scanf("%s",s+),n=strlen(s+),m=gi();
for (RG int i=;i<=m;++i)
for (RG int j=;j<=m;++j) A[][].m[i][j]=i==j;
for (RG int i=;i<m;++i) A[][].m[i+][i]=;
for (RG int i=;i<=m;++i) A[][].m[i][m]=;
for (RG int i=;i<;++i) A[][i]=mul(A[][i-],A[][]);
for (RG int i=;i<=n;++i){
A[i][]=A[][],A[i][]=mul(A[i-][],A[i-][]);
for (RG int j=;j<;++j) A[i][j]=mul(A[i][j-],A[i][]);
}
f[]=A[][];
for (RG int i=;i<=n;++i){
now=A[][s[i]-''];
for (RG int j=i-;~j;--j){
add(f[i],mul(f[j],now));
if (j) now=mul(A[i-j][s[j]-''],now);
}
}
cout<<f[n].m[m][m]; return ;
}
bzoj4037 [HAOI2015]数字串拆分的更多相关文章
- BZOJ4037:[HAOI2015]数字串拆分——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4037 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时 ...
- [HAOI2015]数字串拆分
题目描述 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导0),将他们加 ...
- 洛谷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 表示),按从 ...
随机推荐
- CentOS和RedHat等系列系统 yum源配置、时间同步
一.yum源配置 1,进入yum源配置目录cd /etc/yum.repos.d 2,备份系统自带的yum源mv CentOS-Base.repo CentOS-Base.repo.bk下载163网易 ...
- Vue 多路由文件的合并
Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...
- C# 请求Https
/// <summary> /// Get请求 /// </summary> /// <param name="Url"></param& ...
- 五:SpringCloud-Zuul
九:zuul路由网关 1.概述 1.1 是什么 Zuul包含了对请求的路由和过滤两个最主要的功能: 其中==路由功能==负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础. 而==过 ...
- java中程序上线报错: tomcat中java.lang.OutOfMemoryError: PermGen space
在程序测试没问题之后,上线试运行,在运行的过程中某个功能一点击就报如下错,然后重启服务器就好了,一会又是如此,解决方法如下(亲测) PermGen space的全称是Permanent Generat ...
- poj 3070 Fibonacci 矩阵相乘
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7715 Accepted: 5474 Descrip ...
- MySQL B+树索引和哈希索引的区别(转 JD二面)
导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTRE ...
- CSS实现文字两端对齐
最近的项目遇到了这样的需求:(要求标题部分不管文字多少,都必须两端对齐) 如下图: 当时也没有多想直接使用‘ ’进行代替,毕竟产品同学想快一点看到效果,不敢怠慢!不过到第二个页面就傻眼了. 如图: 这 ...
- BZOJ1258 [CQOI2007]三角形
Description 画一个等边三角形,把三边的中点连接起来,得到四个三角形,把它们称为T1,T2,T3,T4,如图1.把前三个三角形也这样划分,得到12个更小的三角形:T11,T12,T13,T1 ...
- volley2--volley的使用和架构
图片: 下面只是笼统的介绍,大家可以对比自己的想法,看看自己是不是有什么考虑不周的(如果是你实现这样一个框架的话) 1,Request的设计,我们在得到response之后,我们可能根据项目需求希望有 ...