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 表示),按从 ...
随机推荐
- synchronized同步锁
在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问.由于 ...
- 访问Django项目出现DisallowedHost at / Invalid HTTP_HOST header问题
闲来无事,想玩玩django,源码安装碰到了一堆乱七八糟依赖性问题,耗费一下午的时间总算是在ubuntu14.04上搭建好了python3+django2开发环境, 心血来潮,创建了一个django项 ...
- jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)
如果你看了上一篇<ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)>的话,应该就知道我是逼不得已要认真学 ...
- 十六、curator recipes之DistributedIdQueue
简介 curator实现了一种分布式ID队列,也是遵循FIFO原则,比普通队列新增的一个点是ID队列可以根据ID对队列元素进行操作,比如移除该元素. 官方文档:http://curator.apach ...
- 腾讯云安全组,实现服务器外网ip访问网站
添加访问地ip出入站规则HTTP,并将云主机添加到安全组中.
- java 自定义 LRU(最近最少使用)策略 实现 缓存机制
1. java提供了一个简单的方式实现LRU: LinkedHashMap 2. 自定义实现 LRU至少需要两个主要操作: 添加(add)和搜索(search) public class LRU ...
- cookie和session 区别
cookie机制采用的是在客户端保持状态的方案,session机制采用的是在服务器端保持状态的方案. 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很 ...
- vue项目使用vue-i18n和iView切换多语言
效果图: 当然,如果使用iview组件,组件也会对应切换语言. 这里,假设已经用vue-cli脚手架创建了项目,熟悉vue-router,而且已经引入了iview UI. 第一步: 我们在main.j ...
- PHP 如何向关联数组指定的 Key 之前插入元素
PHP 关联数组可以通过三种方式插入新元素: $array[$insert_key] = $insert_value; $array = array_merge($array, $insert_arr ...
- MySQL查询高速缓冲
对mysql的优化不在行,搞过几次优化,但是都不是很理想,还是浪费资源太多.一直发现我的mysql的缓存命中率极差,情况良好的时候到达过60-70%,但是运行时间一长,只有10-20%.查了一些资料, ...