1009: [HNOI2008]GT考试

Time Limit: 1 Sec  Memory Limit: 162 MB

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位的数。 N<=10^9,M<=20,K<=1000

Output

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

Sample Input

4 3 100
111

Sample Output

81

水题
用KMP求出转移矩阵(不反对暴力)
直接矩阵快速幂

/* Stay hungry, stay foolish. */
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<sstream>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<climits>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#include<bitset>
#include<complex>
using namespace std;
/*
#define getchar() getc()
char buf[1<<15],*fs,*ft;
inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin)),fs==ft)?0:*fs++;}
*/
template <class _T> inline void read(_T &_x) {
int _t; bool _flag=false;
while((_t=getchar())!='-'&&(_t<'0'||_t>'9')) ;
if(_t=='-') _flag=true,_t=getchar(); _x=_t-'0';
while((_t=getchar())>='0'&&_t<='9') _x=_x*10+_t-'0';
if(_flag) _x=-_x;
}
typedef long long LL;
const int maxm = 30;
int n, m, mod;
struct Matrix {
int v[maxm][maxm], n, m;
Matrix() {memset(v, 0, sizeof v); }
Matrix(int a, int b):n(a), m(b) {memset(v, 0, sizeof v); }
void init() {for (int i = 0; i <= n && i <= m; ++i) v[i][i] = 1; }
Matrix operator * (Matrix B)const {
Matrix C(n, B.m);
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= B.m; ++j)
for (int k = 0; k <= m; ++k)
(C.v[i][j] += v[i][k] * B.v[k][j]) %= mod;
return C;
}
Matrix operator ^ (int t) {
Matrix ans(n, m), x = *this;
ans.init();
for ( ; t; t >>= 1, x = x * x)
if (t & 1) ans = ans * x;
return ans;
}
inline void print() {
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
printf("%d ", v[i][j]);
}
puts("");
}
}
};
int nxt[maxm];
int main() {
//freopen("test.in","r",stdin);
//freopen(".out","w",stdout);
read(n), read(m), read(mod);
char s[maxm];
scanf("%s", s + 1);
nxt[1] = 0;
for (int i = 2, j; i <= m; ++i) {
j = nxt[i - 1];
while (j && s[j + 1] != s[i]) j = nxt[j];
if (s[j + 1] == s[i]) ++j;
nxt[i] = j;
}
Matrix x(m, m);
for (int i = 0; i < m; ++i) {
for (int j = 0, k; j <= 9; ++j) {
k = i;
while (k && s[k + 1] - '0' != j) k = nxt[k];
if (s[k + 1] - '0' == j) ++k;
if (k != m) (++x.v[k][i]) %= mod;
}
}
x = x ^ n;
int sum = 0;
for (int i = 0; i < m; ++i)
(sum += x.v[i][0]) %= mod;
cout << sum << endl;
return 0;
}

  

BZOJ1009 GT考试的更多相关文章

  1. bzoj1009 GT考试 (kmp+矩阵优化dp)

    设f[i][j]是到第i位 已经匹配上了j位的状态数 然后通过枚举下一位放0~9,可以用kmp处理出一个转移的矩阵 然后就可以矩阵快速幂了 #include<bits/stdc++.h> ...

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

    题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...

  3. HNOI2008题目总结

    呜呼..NOI前一个月正式开始切BZOJ了……以后的题解可能不会像之前的零散风格了,一套题我会集中起来发,遇到一些需要展开总结的东西我会另开文章详细介绍. 用了一天的时间把HNOI2008这套题切了… ...

  4. bzoj1000~1025

    以后还是这样 25道题一起发 看着爽 noip失利之后发粪涂墙 刷了一波bzoj 题解: bzoj1000 A+B问题 这题不同的人有不同的写法,我写了个线段树套Treap,应该还是挺简单的 但是看别 ...

  5. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  6. BZOJ1009 [HNOI2008]GT考试 矩阵

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

  7. 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法

    [BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...

  8. 【bzoj1009】: [HNOI2008]GT考试 字符串-kmp-矩阵乘法-DP

    [bzoj1009]: [HNOI2008]GT考试 先用kmp写个暴力 /* http://www.cnblogs.com/karl07/ */ #include <cstdlib> # ...

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

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

随机推荐

  1. Vulkan入门流程

    原文摘自Vulkan入门流程 Vulkan是Khronos Group(OpenGL标准的维护组织)开发的一个新API,它提供了对现代显卡的一个更好的抽象,与OpenGL和Direct3D等现有api ...

  2. ats 安全

    Controlling Access ats可以配置为仅允许某些客户端使用代理缓存. 1. 为ip_allow.config添加一行,以获取允许访问ats的每个IP地址或IP地址范围; 2. traf ...

  3. "学霸"系统Alpha版本发布说明

    一.版本功能 我们的软件为学霸app,目标功能为:北航校内学子的类“知乎”应用,可以实现用户的管理.提问.回答.搜索.上传.下载以及交互:当前版本主要实现功能为:用户的管理.提问.回答已经交互. 一下 ...

  4. 人生第一次JAVA编程,电梯(并不算完成版),以及IDEA里使用git

    首先先说说Intellij IDEA与git的互联,首先在任意(我是在coding)gitlab里新建一个工程. 然后新建一个工程记得注明url和地址.名称等 如果无法创建,则需要指定git地址 创建 ...

  5. ejabberd与XMPP

    ejabberd支持XMPP协议. worktile用ejabberd来做了实时消息推送: https://worktile.com/tech/basic/worktile-real-time-not ...

  6. django学习--1

    1 安装 安装anacanda后 conda install django 2 新建项目 django-admin.py startproject HelloWorld 创建完成后我们可以查看下项目的 ...

  7. 使用AutoMapper实现Dto和Model的自由转换(下)

    书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...

  8. Python day7之mysql

    写在前面: 由于毕业论文撰写和答辩耽搁了几个月,但是在这几个月没有放弃学习Python,就是没有时间写博客.进行我们主要对数据库mysql的操作指令集的学习. 一.mysql术语 Mysql是最流行的 ...

  9. 01 Maven构建的项目中,把.xml等配置文件添加到编译目录

    Maven构建的项目,默认只会把src/main/resources目录下的xml配置文件添加到编译目录. 如果需要把src/main/java目录下的xml配置文件也添加到编译目录,需要在pom.x ...

  10. Courses HDU - 1083 (二分匹配模板题)

    Consider a group of N students and P courses. Each student visits zero, one or more than one courses ...