拆分的情况下,发现f数组本身并不是很好递推。

因为f(123)=f(123)/f(12+3)/f(1+2+3)。

然后考虑f可以怎么表示f(n)=a0*M^n M为转移矩阵。

然后发现 f(x+y)=a0*M(x+y), 所以只需要对M矩阵进行DP即可。

这样子每一个位置就可以表示为若干转移矩阵的和,然后就可以利用矩阵的相乘进行递推。

最后直接用原向量乘上转移矩阵即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;#define ll long long
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
const ll md=998244353;ll m,l;char s[505];struct matrix{ll x[6][6];void init(){memset(x,0,sizeof x);}void build1(){init();x[1][1]=1;}void build2(){init();F(i,1,m) x[i][1]=1;F(i,1,m-1) x[i][i+1]=1;}void build3(){init();F(i,1,m) x[i][i]=1;}matrix operator * (matrix b) {matrix ret;ret.init();F(i,1,m) F(j,1,m){F(k,1,m)ret.x[i][j]=ret.x[i][j]+x[i][k]*b.x[k][j];ret.x[i][j]%=md;}return ret;}matrix operator + (matrix b) {matrix ret;ret.init();F(i,1,m) F(j,1,m)ret.x[i][j]=((ll)x[i][j]+(ll)b.x[i][j])%md;return ret;}
}dp[505],one,c[11][501],turn,now,ans;int main()
{scanf("%s",s+1);l=strlen(s+1);scanf("%lld",&m);F(i,0,l) dp[i].init();one.build1();turn.build2();c[0][0].build3();F(i,1,10) c[i][0]=c[i-1][0]*turn;F(i,1,l-1){c[0][i]=c[0][i-1];c[1][i]=c[10][i-1];F(j,2,10){c[j][i]=c[j-1][i]*c[10][i-1];}}dp[0].build3();F(i,1,l){now.build3();D(j,i,1){now=now*c[s[j]-'0'][i-j];dp[i]=dp[i]+dp[j-1]*now;}}ans=dp[l]*one;printf("%lld\n",ans.x[1][1]);
}

  

转载于:https://www.cnblogs.com/SfailSth/p/6582010.html

BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划相关推荐

  1. 小红书面试题——paddingNum,用逗号分割数字串

    paddingNum 额,这名字不是我命名的,但是也挺形象的吧,那就叫 paddingNum 吧 题目是这样的 将数字串分割,每隔3位用逗号隔开 eg: 1234 => 1,234; eg: 1 ...

  2. 算法题解:对于输入数字串,给出另一种数字排列,使得字典序增加尽可能小...

    题目分析 题目链接:31. Next Permutation 这题让我们找到比输入数字排列恰好大一点点的数字排列.对这个问题的算法不仅适用于数字串,而且适用于任何有字典序的符号串. 为了方便讨论,我们 ...

  3. ping 用数字串代替IP地址

    Ping命令,大家都比较熟悉,它常被用来测试局域网的连通状态."Ping+IP地址"是大家最常用的一种命令格式,但大家是否注意过Ping命令中的IP地址呢?这里面可是有很多学问和讲 ...

  4. 计算最长公共数字串个数

    一.华为OJ题目(计算最长公共数字个数) 样例输出 输出123058789,函数返回值9 输出54761,函数返回值5 接口说明 函数原型: unsignedint Continumax(char** ...

  5. 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码

    //1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, ...

  6. 《好未来编程题》字符串中找出连续最长的数字串

    题目:读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述: 个测试输入包含1个测试用例,一个字符串str,长度不超过255. 输出描述: 在一行内输出str中里连续最长的数字串. 示 ...

  7. java中实现将一个数字字符串转换成逗号分隔的数字串, 即从右边开始每三个数字用逗号分隔

    源代码如下: /*将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔 */public static void testFenGeNumber(){String number = ...

  8. [0630]Tyvj 1063 数字串

    描述 给你一个长度为n的数字串,数字串里会包含1-m这些数字.如果连续的一段数字子串包含了1-m这些数字,则称这个数字字串为NUM串.你的任务是求出长度最短的NUM串是什么,只需要输出这个长度即可. ...

  9. 计算机存储数字,数字串在计算机内的表示与存储

    数字串在计算机内的表示与存储 人们习惯使用10进制数,而在计算机内,采用二进制表示和处理数据更方便.因此,在计算机输入和输出数据时,要进行十→二和二→十的进制转换处理,这是多数应用环境中的实际情况.而 ...

最新文章

  1. @这位没带口罩的朋友,你让我感染新冠的风险升高百倍!马普所建模计算结果,认真的...
  2. 中国碳化硅行业发展走势与需求前景研究报告2022版
  3. 使用Jmeter进行http接口测试
  4. 火币网的macd怎么算的_黄金投资中MACD的计算方式
  5. ngnx 301 302跳转配置方法
  6. WebSocket介绍
  7. 怎么加载文件_Java虚拟机从入门到入土之JVM的类加载机制
  8. linux服务之samba
  9. 将一个数据插入表中前校验数据是否存在
  10. 我的美丽天使(My Fair Angel)全剧情攻略
  11. cs231n图像分类笔记(上)学习记录
  12. 计算机word英语词汇大全,Microsoft Word - 计算机英语词汇汇总.pdf
  13. php是什么电器元件,电子元件TP是什么意思 如何封装tp的自定义标签,每个方法代表一个...
  14. 关于电商库存扣减的解决方案
  15. Flex语法和常用鼠标手势
  16. 统计本段话的高频词汇——报错:KeyError
  17. 一文读懂什么是物联网!
  18. java 迷你dvd_java基础迷你DVD系统
  19. 国企银行秋招不完全指南
  20. python三个箭头怎么打出来_(Python3)Linux和Windows箭头键按下

热门文章

  1. ubuntu mysql 多硬盘_ubuntu下磁盘空间不足导致mysql无法启动的解决方法
  2. 写爬虫时遇到的问题及解决方法
  3. 解决krpano全景视频在QQ浏览器、安卓不能正常播放的问题
  4. Mac下新安装的MySQL无法登陆root用户解决方法
  5. homebrew安装失败的解决方案
  6. com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method解决方法
  7. 为什么我的程序在完全循环8192个元素时会变慢?
  8. 何时使用.First以及何时将.FirstOrDefault与LINQ结合使用?
  9. 如何仅对文档项目在ECB中应用自定义操作
  10. maven deploy到nexus报错:Return code is: 401, ReasonPhrase:Unauthorized