写了一个早上...就因为把长度为m的也算进去了...

dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j)表示dp(x-1, j)对dp(x, i)的贡献.然后用矩阵快速幂就可以了. 时间复杂度O(M3logN + M)

-------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
const int maxn = 25;
 
int fail[maxn], S[maxn], N, M, MOD;
 
struct matrix {
int n, m;
int a[maxn][maxn];
matrix(int _n = 0, int _m = 0):n(_n), m(_m) {
memset(a, 0, sizeof a);
}
void unit() {
for(int i = 0; i < n; i++)
   a[i][i] = 1;
}
matrix operator * (matrix o) {
matrix ret(n, o.m);
for(int i = 0; i < n; i++)
   for(int k = 0; k < m; k++)
       for(int j = 0; j < o.m; j++)
           ret.a[i][j] = (ret.a[i][j] + a[i][k] * o.a[k][j]) % MOD;
return ret;
}
matrix operator = (matrix o) {
for(int i = 0; i < n; i++)
   for(int j = 0; j < n; j++)
       a[i][j] = o.a[i][j];
return *this;
}
matrix operator ^ (int k) {
matrix ret(n, m), t = *this; ret.unit();
for(; k; k >>= 1) {
if(k & 1) ret = ret * t;
t = t * t;
}
return ret;
}
};
 
void kmp() {
fail[0] = fail[1] = 0;
for(int i = 1; i < M; i++) {
int p = fail[i];
while(p && S[i] != S[p]) p = fail[p];
fail[i + 1] = S[i] == S[p] ? p + 1 : 0;
}
}
 
int main() {
scanf("%d%d%d", &N, &M, &MOD);
for(int i = 0; i < M; i++) {
char c = getchar();
for(; !isdigit(c); c = getchar());
S[i] = c - '0';
}
kmp();
matrix Q(M, M);
for(int i = 0; i < M; i++)
for(int j = 0; j < 10; j++) {
int p = i;
while(p && S[p] != j) p = fail[p];
if(S[p] == j) p++;
Q.a[p][i]++;
}
matrix ans(M, 1);
ans.a[0][0] = 1;
ans = (Q ^ N) * ans;
int tot = 0;
for(int i = 0; i < M; i++)
   if((tot += ans.a[i][0]) >= MOD) tot -= MOD;
printf("%d\n", tot);
return 0;
}

-------------------------------------------------------------------

1009: [HNOI2008]GT考试

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2236  Solved: 1368
[Submit][Status][Discuss]

Description

阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0

Input

第一行输入N,M,K.接下来一行输入M位的数。 100%数据N<=10^9,M<=20,K<=1000 40%数据N<=1000 10%数据N<=6

Output

阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.

Sample Input

4 3 100
111

Sample Output

81

HINT

Source

BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )的更多相关文章

  1. [HNOI2008] GT考试(DP+矩阵快速幂+KMP)

    题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ...

  2. [BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那 ...

  3. BZOJ 3329 Xorequ:数位dp + 矩阵快速幂

    传送门 题意 现有如下方程:$ x \oplus 3x = 2x $ 其中 $ \oplus $ 表示按位异或. 共 $ T $ 组数据,每组数据给定正整数 $ n $,任务如下: 求出小于等于 $ ...

  4. 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...

  5. BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼( dp + 矩阵快速幂 )

    ----------------------------------------------------------------------- #include<cstdio> #incl ...

  6. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  7. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  8. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  9. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

随机推荐

  1. ecshop标签大全 各个页面常用标签大全

    先从index.php主页开始 页面关键字 {$keywords } 页面标题 {$page_title} 产品分类 父分类列表 {foreach from=$categories item=cat ...

  2. CSS: inline-block的应用和float块高度塌陷

    普通流高度塌陷: 当块float浮动时,不会对块布局产生影响,块仍然会按照左右或者上下的顺序排列.但是会影响文档的排列,当文档的高度超过块的高度时,块的高度会产生塌陷现象.   高度塌陷解决方法:   ...

  3. js 字符串为空

    content.replace(/(^\s)|(\s$)/g, "")

  4. NGUI 按钮音效问题

    昨天给NGUI的按钮添加音效时,刚开始是自己新建空对象绑定声音的,后来发现NGUI按钮携带button sound组件,直接将音效拖入即可,不用写一行代码,非常简单.但是后来发现添加相同的音效有的按钮 ...

  5. 解析ASP.NET Mvc开发之删除修改数据

    目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 3)解析ASP.NET Mvc开发之查询数据实例 4)解析ASP.NET Mvc开发之EF延迟加载 ...

  6. Objective-C 链式编程思想

    链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.e ...

  7. PROTEL99 SE生成的gerber 与ncdrill的坐标不对应

    导入cam350后的: 解决方法:出gerber的时候在高级选项里面. 1.数据单位及格式 2.优化设置

  8. java.lang.ClassNotFoundException: javax.servlet.Filter

    java.lang.ClassNotFoundException: javax.servlet.Filter:有两个原因:(1)在maven中的作用域,不能是provided,需要是compile就是 ...

  9. Python web框架有哪些

    简单易学的web.py, 大型的django:文档最完善.市场占有率最高.招聘职位最多. Tornado 具体看:http://feilong.me/2011/01/talk-about-python ...

  10. A. Liserious战队

    Liserious战队是一支活跃在京沪地区的著名密室逃脱战队,在优秀的队长Liserious和芳姐的带领下,打遍天下大大小小的密室逃脱,攻无不克,战无不胜,上天入地无所不能. 世界密室逃脱委员会以IS ...