当前位置: 首页 > news >正文

20260527 紫题训练

P3176 [HAOI2015] 数字串拆分

考虑 \(f\) 怎么求,由定义显然有 \(f(x)=\sum_{i=1}^m f(x-i)\)

特别地,有 \(f(0)=1\)\(f(i)=0,i<0\)

这个转移可以用矩阵乘法刻画:

\[\begin{bmatrix} 1&1&1&\cdots&1&1\\ 1&0&0&\cdots&0&0\\ 0&1&0&\cdots&0&0\\ 0&0&1&\cdots&0&0\\ \vdots&\vdots&\vdots&\ddots&0&0\\ 0&0&0&\cdots&1&0 \end{bmatrix} \times \begin{bmatrix} f_i\\f_{i-1}\\\vdots\\f_{i-m+1} \end{bmatrix} = \begin{bmatrix} \displaystyle\sum_{j=i-m+1}^i f_j\\ f_i\\\vdots\\f_{i-m+2} \end{bmatrix} = \begin{bmatrix} f_{i+1}\\f_i\\\vdots\\f_{i-m+2} \end{bmatrix} \]


\(\begin{bmatrix} f_i\\f_{i-1}\\\vdots\\f_{i-m+1} \end{bmatrix}\)\(f(i)\) 对应的矩阵,\(s_{l\sim r}\) 表示数字串 \(s\)\(l\sim r\) 位表示的数。

\(h_i\) 表示 \(g(s_{1\sim i})\) 的值,那么答案就是 \(h_{|s|}\)

\(h_i\) 可以由 \(0\le j<i\)\(h_j\) 转移而来,对于每个计入 \(h_j\)\(f(x)\),转移到 \(h_i\) 会让它们变成 \(f(x+s_{j+1\sim i})\)。相当于乘上转移矩阵的 \(s_{j+1\sim i}\) 次幂。

由于矩阵乘法具有乘法对加法的分配律,因此修改 \(h_i\) 的定义为所有会对 \(g(s_{1\sim i})\) 造成贡献的 \(f(x)\) 对应的矩阵之和。

记转移矩阵为 \(T\)\(h_i\) 的转移为:

\[h_i=\sum_{j=0}^{i-1} h_j\times T^{s_{j+1\sim i}} \]

其中 \(T^{s_{l\sim r}}\) 的式子可以预处理:

\(s_{l\sim r}=10s_{l\sim r-1}+s_r\),因此

\[T^{s_{l\sim r}}\\ =T^{10s_{l\sim r-1}+s_r}\\ =(T^{s_{l\sim r-1}})^{10}\times T^{s_r} \]

可以递推求出。时间复杂度 \(\mathcal O(|s|^2m^3)\)

#include<bits/stdc++.h>
#define N 505
using namespace std;
int n,m;char s[N];
constexpr int P=998244353;
struct Mat{int a[5][5];Mat(){memset(a,0,sizeof a);}void operator+=(const Mat &x){for(int i=0;i<m;i++) for(int j=0;j<m;j++)(a[i][j]+=x.a[i][j])<P||(a[i][j]-=P);}Mat operator*(const Mat &x){Mat res;for(int i=0;i<m;i++)for(int j=0;j<m;j++){long long v=0;for(int k=0;k<m;k++)v+=1ll*a[i][k]*x.a[k][j];res.a[i][j]=v%P;}return res;}
}f[N],g[N][N],T[10];
Mat Pow(const Mat &x){Mat res=x;for(int i=0;i<9;i++)res=res*x;return res;
}
int main(){scanf("%s%d",s+1,&m);n=strlen(s+1),f[0].a[0][0]=1;for(int i=0;i<m;i++){T[0].a[i][i]=T[1].a[0][i]=1;if(i<m-1) T[1].a[i+1][i]=1;}for(int i=2;i<=9;i++) T[i]=T[i-1]*T[1];for(int i=1;i<=n;i++){g[i][i]=T[s[i]^48];for(int j=i+1;j<=n;j++)g[i][j]=Pow(g[i][j-1])*T[s[j]^48];}for(int i=1;i<=n;i++)for(int j=0;j<i;j++)f[i]+=f[j]*g[j+1][i];printf("%d",f[n].a[0][0]);return 0;
}
http://www.jsqmd.com/news/898703/

相关文章:

  • STM32H743模拟SMBUS读取BQ40Z50电量,我踩过的坑和波形图都在这了
  • 科研效率翻倍!大模型辅助文献检索与筛选:1天搞定1周工作量
  • RTX 4090 Ti vs A100 规格对比表 ai算力对比,来源https://hmc-tech.com/
  • 越秀区搬家公司电话 异地搬家省钱全攻略(2026 最新) - 从来都是英雄出少年
  • 【ECC 内存技术】在关键业务系统中的实战应用
  • 保姆级教程:在RK3588开发板上搞定GT9XX触摸屏驱动(附常见问题修复)
  • 网络工程师的英语水平,到底需要到什么程度?
  • 2026年溶解氧检测仪信誉与价值评估:从口碑积累到性价比的技术解读 - 品牌推荐大师1
  • 高频SSVEP脑机接口:基于相位同步梳状滤波器的鲁棒解码方案
  • DDrawCompat:让经典游戏在现代Windows上完美运行的终极兼容方案
  • ProperTree:跨平台plist文件编辑器的终极解决方案
  • 碾压旧版本!YOLOv10自定义数据集训练全实战:从标注到部署,新手也能1遍成
  • 【实践】DICOM C-Move 服务深度解析:从三方通信架构到 fo-dicom 实战
  • 2026年会议总结工具横评:会议录音转文字做总结10分钟搞定
  • 利用Taotoken用量看板精细化管控团队AI调用成本
  • 三步解锁小爱音箱终极潜能:开源固件重塑智能语音助手
  • 一个被囚禁在服务器里的“灵魂”,和一片永远寂静的代码,哪个更让你脊背发凉?
  • 知乎算法最新变动下,ChatGPT回答如何逃过“低质识别”?,2024Q2平台审核白皮书深度适配指南
  • WarcraftHelper终极指南:让魔兽争霸3在现代电脑上流畅运行的必备工具
  • 终极指南:如何用Squirrel-RIFE让任何视频流畅度翻倍
  • Overleaf新手避坑指南:从‘乱码’到完美中文简历,我只用了这3步(XeLaTeX配置详解)
  • 基于FPGA的ETEDPOF无源控制在电动汽车电机驱动中的应用
  • 在Node.js后端项目中集成稳定的大模型API,实现智能客服回复
  • 模拟IC设计进阶:在Cadence 617中,如何用参数扫描优化你的gmid设计点?
  • GitHub加速终极指南:三分钟解决访问缓慢和图片加载问题
  • 【限时解密】ChatGPT二级市场套利框架:如何用期权对冲+事件驱动+情绪周期,在财报季前锁定15%确定性收益?
  • 链表高频手撕面试题|反转链表、环形链表
  • 弗吉尼亚理工大学用“储层计算“技术突破软体机器人控制难题
  • 从零构建个人数字品牌:定位、内容与影响力实战指南
  • PvZ Toolkit:重新定义植物大战僵尸游戏体验的开源工具箱