loj#2128. 「HAOI2015」数字串拆分 矩阵乘法
目录
题目链接
题解
\(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\)
这个可以用转移矩阵通过矩阵乘法处理出来
预处理出\(A[i][j]\)表示数S为\(j * 10 ^ i\)的转移矩阵
对于g的转移
\(g(i) = \sum_{j = 0}^{i - 1}g(j) * D(j + 1,i)\)
D[i][j]表示第i位到底j位构成的数的f,(转移矩阵
对于g的转移也是需要矩阵的
g(0) = 1也就是{0,0,0,.....,0,1}
代码
#include<map>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gc getchar()
#define pc putchar
#define LL long long
inline int read() {
int x = 0,f = 1;
char c = gc;
while(c < '0' || c > '9')c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0');
}
const int maxn = 507;
int n,m;
const int mod = 998244353;
struct Ma {
int a[6][6];
Ma() { memset(a,0,sizeof a); }
Ma operator * (const Ma & t)const {
Ma ret;
memset(ret.a,0,sizeof ret.a);
for(int i = 1;i <= m;++ i)
for(int j = 1;j <= m;++ j)
for(int k = 1;k <= m;++ k)
(ret.a[i][j] += 1ll * a[i][k] * t.a[k][j] % mod) %= mod;
return ret;
}
Ma operator + (const Ma &k)const {
Ma ret;
memset(ret.a,0,sizeof ret.a);
for(int i = 1;i <= m;++ i)
for(int j = 1;j <= m;++ j)
ret.a[i][j] = (a[i][j] + k.a[i][j]) % mod;
return ret;
}
} A[maxn][10],f[maxn];
char s[maxn];
int main() {
scanf("%s",s + 1);
n = strlen(s + 1);
m = read();
for(int i = 1;i <= m;++ i)
A[0][0].a[i][i] = 1 ,
A[0][1].a[i][m] = 1;
for(int i = 1;i < m;++ i)
A[0][1].a[i + 1][i] = 1;
for(int i = 2;i <= 9;++ i)
A[0][i] = A[0][i - 1] * A[0][1];
for(int i = 1;i <= n;++ i) { //十进制快速幂
A[i][0] = A[0][0];
A[i][1] = A[i - 1][9] * A[i - 1][1];
for(int j = 2;j <= 9;++ j)
A[i][j] = A[i][j - 1] * A[i][1];
}
f[0].a[1][m] = 1;
Ma now;
for(int i = 1;i <= n;++ i) {
now = A[0] [s[i] - '0'];
for(int j = i - 1;j >= 0;-- j) {
f[i] = f[i] + (f[j] * now);
if(j) now = A[i - j][s[j] - '0'] * now;
}
}
print(f[n].a[1][m]);
pc('\n');
return 0;
}
loj#2128. 「HAOI2015」数字串拆分 矩阵乘法的更多相关文章
- 【LOJ】#2128. 「HAOI2015」数字串拆分
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...
- loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- LOJ#2127「HAOI2015」按位或
用$ Min-Max$容斥之后要推的东西少了好多 无耻的用实数快读抢了BZOJ.Luogu.LOJ三个$ OJ$的Rank 1 即将update:被STO TXC OTZ超了QAQ 题意:集合$ [0 ...
- LOJ#2083. 「NOI2016」优秀的拆分
$n \leq 30000$的字符串,问其所有子串的所有AABB形式的拆分有多少种.$t \leq 10$组询问. $n^3$过80,$n^2$过95,鬼去写正解.. $n^2$:先枚举一次算每个位置 ...
- 「BZOJ2510」弱题(矩阵乘法,降维)
有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < ...
- loj#2013. 「SCOI2016」幸运数字 点分治/线性基
题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍
第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...
- Oracle 同步
原文出处:http://www.cnblogs.com/zeromyth/archive/2009/08/19/1549661.html Oracle备份功能包括: 高级复制(Advanced Rep ...
- MyEclipse2014安装插件的几种方式(适用于Eclipse或MyEclipse其他版本)
农历 乙未 羊年 十一月初九 周六 2015年12月19日 14:29 编辑者:刘军 标题: 服务器的搭建请参考该文:<Win7 x64 svn 服务器搭建> ============== ...
- python for dl
算是python的简明教程吧,总结的不错: https://zhuanlan.zhihu.com/p/24162430 python for opencv: https://zhuanlan.zhih ...
- 【C++ Primer | 15】C++虚函数表剖析①
概述 为了实现C++的多态,C++使用了一种动态绑定的技术.这个技术的核心是虚函数表(下文简称虚表).本文介绍虚函数表是如何实现动态绑定的. C++多态实现的原理: • 当类中声明虚函数时,编译器会 ...
- 在Centos中安装aria2c
# 安装aria2c 1 安装epel源 rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm ...
- D 矩阵快速幂
Description <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配 ...
- python全栈开发day34-线程Thread
一.昨日内容回顾 1. 概念和理论 进程是计算机资源分配最小单位 进程三状态.同步.异步.阻塞.非阻塞 2. 进程的创建 实例化.自建类run,start,join,terminate,daemon等 ...
- Windows 7下载安装 Visual C++ 6.0(VC6) 全程图解
说实话我也一直没有试过,所以也想当然的认为Win7下就不能安装VC6,压根就100%不兼容?一直使用高版本的VS(如VS2008和现在用的VS2010)的我今天亲身在Win7下安装一次试试. 注:文中 ...
- K-means聚类算法及python代码实现
K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的) 1.概述 K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其 ...