首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式,交了一下完全没问题2333,并不知道为啥) 好久没写矩阵加速了,顺便说一下我的构造方法吧: 首先明确转移矩阵的目的,设m为构成f[i]的最小项f[i-m],也就是f[i]=f[i-m]+f[i-...]+f[i-...]+....,其中i-m是最小的.我们需要构造一个m大小的矩阵,使得{f[i-m…
拆分的情况下,发现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 <iostre…
qwq真的是一道好题qwq自己做基本是必不可能做出来的. 首先,如果这个题目只是求一个\(f\)数组的话,那就是一道裸题. 首先,根据样例 根据题目描述,我们能发现其实同样数字的不同排列,也是属于不同的方案的,那统计起来其实方便很多. 首先我们发现,对于\(i\)这个数,他可以拆出来\([1,m]\)任何一个数,接在对应的\(f[i-1]到f[i-m]\) 也就是说\(f[i]=f[i-1]+f[i-2]+f[i-3]....f[i-m]\) qwq那我们可以构造出转移矩阵 以\(m=3\)为栗…
https://www.lydsy.com/JudgeOnline/problem.php?id=4037 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5. 你可以将这个数字串分割成若干个数字(允许前导0),将他们加起来,求f,并求和.比如g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123). 已知字符串和m后求答案对998244353(7*17*223+1,一个质数)取模后的值. 神仙?(亦或是我从来没见过如此…
Description 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导0),将他们加起来,求f,并求和.比如g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123).已知字符串和m后求答案对998244353(7×17×223+1,一个质数)取模后的值. Input 第一行输入一个字符串,第二行输入m Output 仅输出一个数表示答案 Sampl…
题目描述 你有一个长度为n的数字串.定义f(S)为将S拆分成若干个1~m的数的和的方案数,比如m=2时,f(4)=5,分别为4=1+1+1+1你可以将这个数字串分割成若干个数字(允许前导0),将他们加起来,求f,并求和.比如g(123)=f(1+2+3)+f(1+23)+f(12+3)+f(123).已知字符串和m后求答案对998244353(7*17*223+1,一个质数)取模后的值. 输入输出格式 输入格式: 第一行输入一个字符串,第二行输入m 输出格式: 仅输出一个数表示答案 输入输出样例…
目录 题目链接 题解 代码 题目链接 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的转移也…
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{i - 1} dp[j] * tr[j + 1][i]\) \(tr[j][i]\)表示矩阵的\([j,i]\)组成的数字次幂是什么样的矩阵 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pai…
Sample Input 6 1212 Sample Output 298 给定一个数字字符串S,如果一个数字字符串(只包含0-9,可以有前导0)中出现且只出现1次S,我们就称这个字符串是好的. 例如假设S=666,则1666.03660666是好的,6666.66.123不是好的:假设S=1212,则01212.12123是好的,121212.121是不好的. 请你计算长度为N的数字字符串中,有多少个是好的.由于总数可能很大,你只需要输出总数模1000000007的余数. Input 一个整数…
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Father[i] 之间的边对答案的贡献(比如这条边对黑点对距离和的贡献就是子树内部的黑点数 * 子树外部的黑点数 * 这条边的权值). 然后DFS来求,枚举 i 的每个儿子 j,现在的 f[i][] 是包含了 [1, j-1] 子树,然后两重循环枚举范围是 [1, j - 1] 的子树总 Size 和…