题目链接

\(f[i][j]\)表示准考证号到第\(i\)位,不吉利数字匹配到第\(j\)位的方案数。

答案显然是\(\sum_{i=0}^{m-1}f[n][i]\)

\(f[i][j]=\sum_{k=1}^{m-1}f[i-1][k]*g[k][j]\)

\(g[i][j]\)表示不吉利数字匹配到第\(i\)位后加一个数字能匹配到第\(j\)位的方案数,因为这个数字是固定的,可以通过\(kmp\)求出来。

然后观察到\(f[i][j]\)的递推式是个矩阵,用矩阵快速幂加速即可。

#include <cstdio>
#include <cstring>
const int MAXM = 22;
char a[MAXM];
int nxt[MAXM], g[MAXM][MAXM], f[MAXM], tmp[MAXM][MAXM], temp[MAXM];
int n, m, mod, ans;
void gg(){
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= m; ++j){
tmp[i][j] = 0;
for(int k = 1; k <= m; ++k)
(tmp[i][j] += g[i][k] * g[k][j]) %= mod;
}
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= m; ++j)
g[i][j] = tmp[i][j];
}
void gf(){
for(int i = 1; i <= m; ++i){
temp[i] = 0;
for(int j = 1; j <= m; ++j)
(temp[i] += f[j] * g[j][i]) %= mod;
}
for(int i = 1; i <= m; ++i) f[i] = temp[i];
}
void fast_pow(int k){
while(k){
if(k & 1) gf();
gg(); k >>= 1;
}
}
int main(){
scanf("%d%d%d%s", &n, &m, &mod, a + 1);
int p = 0;
for(int i = 2; i <= m; ++i){
while(a[i] != a[p + 1] && p) p = nxt[p];
if(a[i] == a[p + 1]) ++p;
nxt[i] = p;
}
for(int i = 0; i < m; ++i)
for(int j = '0'; j <= '9'; ++j){
int tmp = i;
while(a[tmp + 1] != j && tmp) tmp = nxt[tmp];
if(a[tmp + 1] == j) ++tmp;
if(tmp < m) ++g[i + 1][tmp + 1];
}
f[1] = 1;
fast_pow(n);
for(int i = 0; i <= m; ++i)
(ans += f[i]) %= mod;
printf("%d\n", ans);
return 0;
}

最新文章

  1. 常用的一些linux命令
  2. HTML5之拖放
  3. 深入了解nagios的各配置文件
  4. 使用Memcached、Spring AOP构建数据库前端缓存框架
  5. JPA字段映射(uuid,日期,枚举,@Lob)
  6. 第二次冲刺spring会议(第二次会议)
  7. Java的进制转换操作(十进制、十六进制、二进制)
  8. java二分查找详解
  9. java 多线程和并行程序设计
  10. lerna import &amp;&amp; add 使用&amp;&amp;常见问题解决
  11. C#:使用HtmlAgilityPack解析Html
  12. Linux&#160;nohup命令应用简介--让Linux的进程不受终端影响
  13. PHP 使用 MongoDB
  14. Hadoop HBase概念学习系列之HBase里的HStore(十九)
  15. 关于javascript异步编程的理解
  16. fifo 上使用 select -- 转
  17. CentOS6安装Pyhon3
  18. 使用PPT演讲时,两个屏幕显示的内容不一样
  19. win10 清理winsxs文件夹
  20. 解决SQLite打开已有路径下的db问题

热门文章

  1. (转载)golang 整数常量INT_MAX INT_MIN最大值最小值
  2. spring @Transactional 事务注解的坑
  3. 正则表达式在线分析 regex online analyzer
  4. 手把手教你 GitLab 的安装及使用
  5. 【spring源码分析】@Value注解原理
  6. 【转载】 【TensorFlow】static_rnn 和dynamic_rnn的区别
  7. mysql监控工具sqlprofiler,类似sqlserver的profiler工具安装(一)
  8. IDEA 如何搭建maven 安装、下载、配置(图文)
  9. 安装hbase分布式集群出现的报错- ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
  10. consul多数据中心搭建 【h】