\(f[i][j]\)表示当前摆放到第\(i\)位,然后当前的匹配长度为\(j\)

  • \(f[i][j]=\sum {f[i][k]*g[k][j]}\)

\(g[i][j]\)表示将长度为\(i\)的匹配变成长度为\(j\)的匹配的方案数。这个可以kmp预处理出来:枚举当前已匹配长度\(i\)和当前要放的下一个字符,跳一下\(nxt\)看能匹配的长度,每次对\(g[i][j]+1\)即可。这样是\(O(10\times m^2)\)

然后这个式子矩阵快速幂优化一下即可。

总复杂度是\(O(10\times m^2+m^3\log n)\)

/*
$f[i][j]$表示当前摆放到第$i$位,然后当前的匹配长度为$j$
* $f[i][j]=\sum {f[i][k]*g[k][j]}$
$g[i][j]$表示加一个字符将长度为$i$的匹配变成长度为$j$的匹配的方案数。这个可以kmp预处理出来。
*/
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 25; inline void read(int &x) {
x = 0; int f = 1; char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
x *= f;
} int n, m, mod, nxt[N];
char a[N]; struct mat {
int c[21][21];
mat() {memset(c, 0, sizeof(c));}
mat operator * (mat &x) {
mat ans;
for(int i = 0; i < m; ++i)
for(int j = 0; j < m; ++j)
for(int k = 0; k < m; ++k)
(ans.c[i][j] += c[i][k] * x.c[k][j] % mod) %= mod;
return ans;
}
}A; int main() {
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);
#endif
read(n); read(m); read(mod);
scanf("%s", a + 1);
memset(nxt, 0, sizeof(nxt));
for(int i = 2, j = 0; i <= m; ++i) {
while(j && a[j + 1] != a[i]) j = nxt[j];
if(a[j + 1] == a[i]) ++j;
nxt[i] = j;
}
for(int i = 0; i < m; ++i) {
for(int j = '0'; j <= '9'; ++j) {
int tmp = i;
while(tmp && a[tmp + 1] != j) tmp = nxt[tmp];
if(a[tmp + 1] == j) ++tmp;
if(tmp != m) ++A.c[i][tmp];
}
}
mat ans;
ans.c[0][0] = 1;
while(n) {
if(n & 1) ans = ans * A;
A = A * A; n >>= 1;
}
int Ans = 0;
for(int i = 0; i < m; ++i) (Ans += ans.c[0][i]) %= mod;
printf("%d\n", Ans);
return 0;
}

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

  1. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  2. 【bzoj1009】[HNOI2008]GT考试

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

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

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

  4. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  5. [HNOI2008] GT考试

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

  6. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

  7. BZOJ1009 [HNOI2008]GT考试 矩阵

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

  8. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

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

  9. bzoj1009 / P3193 [HNOI2008]GT考试

    P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...

随机推荐

  1. [Gamma] 项目展示

    [Gamma] 项目展示 一.工程展示 1.项目简介 定位分析 我们的目标是做一个创意分享网站,在之前的阶段中完成了大框架的搭建,并以此为基础进行界面优化与功能扩展. 典型用户 用户 面临困境 需求功 ...

  2. @RequestMapping 用法详解

    简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestM ...

  3. 5 系统的软中断CPU升高,一般处理办法?

    还是需要多动手,一个一个问题个被get!

  4. Zookeeper的介绍与基本部署

    目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...

  5. sql语句递归查询(start with)

    在做项目中遇到一个问题,就是同一个表中的数据存在级联关系,但是只要查出来的末级数据,纠结了好久,好不容易找到了一个博主的分享,在这里做个记录,也是和大家一起分享学习一下这位大神的技术,共勉 写代码时碰 ...

  6. FPGA控制RGMII接口PHY芯片基础

    一.前言 网络通信中的PHY芯片接口种类有很多,之前接触过GMII接口的PHY芯片RTL8211EG.但GMII接口数量较多,本文使用RGMII接口的88E1512搭建网络通信系统.这类接口总线位宽小 ...

  7. typescript nodejs 依赖注入实现

    依赖注入通常也是我们所说的ioc模式,今天分享的是用typescript语言实现的ioc模式,这边用到的主要组件是 reflect-metadata 这个组件可以获取或者设置元数据信息,它的作用是拿到 ...

  8. HashMap源码原理

    HashMap源码解析(负载因子,树化策略,内部hash实现,resize策略) 内部属性: 负载因子: final float loadFactor(默认为0.75f) 实际容量: int thre ...

  9. 豆瓣Top250

    """ 爬取豆瓣电影TOP250 - 完整示例代码 """ import codecs import requests from bs4 i ...

  10. js浏览器对象模型【BOM】(十三)

    一.时间定时器1.超时调用setTimeout(fun,time)    [返回一个唯一标识该超时调用的ID数值]参数:fun:要执行的函数time:设置第多少毫秒后执行fun函数 clearTime ...