这题比较难搞。考虑设计状态:\(f_{i,j}\) 表示当前考虑到 \(X_i\) 位,且 \(X\) 的后 \(j\) 位刚好与 \(A\) 列匹配时的方案数。最终答案为 \(\sum_{i=0}^{m-1}f_{n,i}\)。

接下来考虑如何转移,如果我们以外层位置作为状态,则必然是从 \(f_{i-1}\) 转移到 \(f_i\) 来,我们需要枚举最后一位进行转移,但枚举最后一位对内层循环却不太好控制,因为我们不太清楚它的匹配长度到底是多少。所以转化思路,另设 \(g_{i,j}\) 表示在 \(X\) 的后 \(i\) 位与 \(A\) 列匹配的情况下,有多少种加数字的方法使得匹配长度变为 \(j\),这么做可以使 \(g\) 只与 \(A\) 列有关,能够预处理出来。

那么转移方程:

\[f_{i,j}=\sum_{k=0}^{m-1}f_{i-1,k}g_{k,j}
\]

由于 \(n\) 比较大,又发现这个式子长得很像矩阵乘法的式子,故可以快速幂递推。即

\[F_i=[f_{i,0}\ f_{i,1} \ \dots \ f_{i,m-1}]=F_{i-1}G,F_n=F_0G^n
\]

代码还是挺好写的

#include <bits/stdc++.h>
using namespace std; const int N=25;
int n,m,djq,nxt[N],g[N][N],f[N][N],res[N][N],ans;
char s[N]; void mul(int a[N][N],int b[N][N])
{
static int c[N][N];
memset(c,0,sizeof(c));
for(int i=0;i<m;++i)
for(int j=0;j<m;++j)
for(int k=0;k<m;++k)
(c[i][j]+=a[i][k]*b[k][j])%=djq;
memcpy(a,c,sizeof(c));
} int main()
{
scanf("%d%d%d %s",&n,&m,&djq,s+1);
for(int i=2,j=0;i<=m;++i)
{
while(j&&s[i]!=s[j+1]) j=nxt[j];
if(s[i]==s[j+1]) ++j;
nxt[i]=j;
}
for(int i=0;i<m;++i)
for(char j='0';j<='9';++j)
{
int k=i;
while(k&&s[k+1]!=j) k=nxt[k];
if(s[k+1]==j) ++k;
++g[i][k];
}
for(int i=0;i<m;++i) res[i][i]=1;
for(;n;n>>=1,mul(g,g))
if(n&1) mul(res,g);
f[0][0]=1; mul(f,res);
for(int i=0;i<m;++i) (ans+=f[0][i])%=djq;
printf("%d\n",ans);
return 0;
}

[HNOI2008]GT考试 题解的更多相关文章

  1. 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解

        看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...

  2. BZOJ1009:[HNOI2008]GT考试——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0&l ...

  3. 【bzoj1009】[HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3018  Solved: 1856[Submit][Statu ...

  4. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  5. [HNOI2008] GT考试

    [HNOI2008] GT考试 标签 : DP 矩阵乘法 题目链接 题意 n位数中不出现一个子串的方案数. 题解 \(设dp[i][j]\)为前i位匹配到j时的合法方案数.(所谓合法,就是不能有别的匹 ...

  6. BZOJ1009 [HNOI2008]GT考试 矩阵

    去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...

  7. 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法

    [BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...

  8. bzoj1009 [HNOI2008] GT考试 矩阵乘法+dp+kmp

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4542  Solved: 2815[Submit][Statu ...

  9. bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)

    1009: [HNOI2008]GT考试 题目:传送门 题解: 看这第一眼是不是瞬间想起组合数学??? 没错...这样想你就GG了! 其实这是一道稍有隐藏的矩阵乘法,好题! 首先我们可以简化一下题意: ...

随机推荐

  1. H5简介(转)

    H5究竟是什么? "HTML5(WEB前端)技术由HTML(结构).CSS(样式).JavaScript(行为)组成.HTML5是WEB的未来,HTML5不仅在PC端,更是在移动端上也有广泛 ...

  2. 性能工具之Jmeter-Dubbo脚本开发

    内容目录: 1.idea 环境项目部署 2.nacos 环境部署 3.dubbo插件部署 4.不带参数请求 5.带参参数请求 Apache Dubbo  是一款高性能.轻量级的开源Java RPC框架 ...

  3. 07:mysql的unknown variable ‘xxxxx’

    简单说明一下: 可能有的找不到配置文件的,不要慌,这个时候 你可能以前安装了多个版本的mysql 就是说你以前是mysql5,现在换成了mysql8, 矮!! 你可能发现你的mysql8里面没有配置文 ...

  4. 学习响应式编程 Reactor (5) - reactor 转换类操作符(2)

    Reactor 操作符 上篇文章我们将 Flux 和 Mono 的操作符分了 11 类,我们来继续学习转换类操作符的第 2 篇. 转换类操作符 转换类的操作符数量最多,平常过程中也是使用最频繁的. F ...

  5. expdp数据泵导出数据汇总

    [oracle@enmo1 ~]$ mkdir datadump[oracle@enmo1 ~]$ cd datadump/[oracle@enmo1 datadump]$ pwd/home/orac ...

  6. 使用axios模拟表单提交

    1.需求背景 最近在实验室写一个Spring前后端分离的项目,项目中使用Spring Security组件实现系统的认证和授权,当Security的认证模式设置为FormLogin时(如下代码),前端 ...

  7. .NET网页后台调用前台js方法时相同Key,调用不成功

    ClientScript.RegisterStartupScript(GetType(), "key", "<script>Save()</script ...

  8. 关于equals()和hashcode()的一些约定

    本文章主要讨论和回答一下几个问题: equals()的四大特性 equals()和hashcode()之间的关系,为什么我们经常说这两个方法要么都重写,要么都不重写? HashMap.HashSet等 ...

  9. 2021年Wordpress手把手教你做个独立站——部署篇

    2021年Woocommerce电商主题的安装部署教程 Woocommerce是一个Wordpress的一个流行的电商插件.完成Wordpress的安装即已完成80%.剩下的便是去寻找一款合适的自己喜 ...

  10. 11、gitlab和Jenkins整合(1)

    1.在jenkins上安装git: 因为jenkins需要在gitlab上拉取代码: 具体的git安装,参考"4.git和gitlab的配置--4.2.git编译安装:": 2.在 ...