写了一个早上...就因为把长度为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. Network of Schools(强连通分量+缩点) (问添加几个点最少点是所有点连接+添加最少边使图强连通)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13801   Accepted: 55 ...

  2. URAL 1303

    题目大意:给出N个区间[Li,Ri](1<=i<=N),一个正整数M,求N个区间里,并区间包含[0,M]的区间的最小个数(无解时输出:No solution). KB     64bit ...

  3. Js动态设置Img大小

    function ResizePic() {        $('img').each(function () {            var maxWidth = 450; // 图片最大宽度   ...

  4. js中new构造函数的研究

    <javascript高级编程>里对new操作符的解释: new操作符会让构造函数产生如下变化: 1.       创建一个新对象: 2.       将构造函数的作用域赋给新对象(因此t ...

  5. DevExpress ASP.NET 使用经验谈(4)-CriteriaOperator的使用

    上一节中,我们已经介绍了,使用CriteriaOperator表达式,获取对象数据. CriteriaOperator criteria = CriteriaOperator.Parse(" ...

  6. TreeView控件绑定数据库

    1.在设计视图里面的代码 <form id="form1" runat="server"> <div> <h1>两个表< ...

  7. C#面向对象编程基础-喜课堂笔记

    **************[5][C#面向对象编程基础]第1讲:类与对象****************                 *************2.1.1_类与对象的概念**** ...

  8. iOS开发针对SQL语句的封装

      1.使用依赖关系 a.需要添加libsqlite3.tbd 静态库. b.需要添加第三方框架 FMBD.MJExtension. 2. SQL语句类封装名DataBaseSqlTool 类方法介绍 ...

  9. Main function

    Main function A program shall contain a global function named main, which is the designated start of ...

  10. The Power of Reading——英语学习小技巧之七

    This method is "The Power of Reading" and it comes from an article by Dr.Stephen Krashen. ...