这题比较难搞。考虑设计状态:\(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;
}

最新文章

  1. Linux 批量修改文件名
  2. ZERO 笔试
  3. 用github pages展示你的静态网页,多项目支持
  4. 李洪强iOS开发本人集成环信的经验总结_07_监听好友请求
  5. 【暑假】[数学]UVa 1262 Password
  6. Windows Azure的故障检测和重试逻辑
  7. 验证浏览器是否安装已flash插件的js脚本
  8. Struts2框架05 result标签的类型
  9. Java网络连接之HttpURLConnection、HttpsURLConnection
  10. k8s踩坑记 - kubeadm join 之 token 失效
  11. off-canvas:抽屉式页面布局的纯css实现
  12. android shape 怎么在底部画横线
  13. 读懂掌握 Python logging 模块源码 (附带一些 example)
  14. 解决npm install过程中报错:unable to verify the first certificate
  15. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建自定义视图
  16. 接口interface、实现接口implements
  17. 大数据学习笔记02-HDFS-常用命令
  18. day_11py学习
  19. ubuntu16.04 关闭防火墙的方法
  20. 通过微信公众号ID生成公众号的二维码

热门文章

  1. Redis 入门权威指北
  2. ES6中的新特性:Iterables和iterators
  3. 【NX二次开发】Block UI OrientXpress
  4. UF_DRAW 制图操作
  5. centos 7 能ping通但是telnet 22 不通解决方法
  6. 小白学k8s(7)helm[v3]使用了解
  7. JAVA实现按列表中元素的时间字段排序
  8. 怎样用好PS中的钢笔工具(附练习钢笔工具网站)
  9. Redis之内存优化
  10. 使用VS2017开发APP中使用VUE.js开发遇到打包出来的android文件 在低版本的android(4.3)中无法正常使用