Description

题库链接

问你长度为 \(n\) 的可含前导零的数字串中,不含长度为 \(m\) 的子串 \(X\) 有多少个,取模。

\(1\leq n\leq 10^9,1\leq m\leq 20\)

Solution

一个显然的 \(DP\) ,就是令 \(f_{i,j}\) 表示已经生成出的串长为 \(i\) 位,后 \(j\) 位与 \(X\) 串的前 \(j\) 位匹配的方案数。

那么 \(f_{i,j}=\sum_{x=1}^m f_{i-1,x}\cdot[x 可以转移到 j]\) 。

由于 \(n\) 过大,我们可以用矩阵加速。在构造矩阵时可以用 \(KMP\) 中的 \(next\) 数组的思想来简化计算过程,省去了暴力的计算。

Code

//It is made by Awson on 2018.3.14
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); } int n, m, k, nxt[25];
char ch[25];
struct mat {
int a[25][25];
mat() {memset(a, 0, sizeof(a)); }
mat operator * (const mat &b) const {
mat ans;
for (int i = 0; i <= m; i++)
for (int j = 0; j <= m; j++)
for (int p = 0; p <= m; p++)
ans.a[i][j] = (ans.a[i][j]+a[i][p]*b.a[p][j]%k)%k;
return ans;
}
}S, T; void build() {
for (int i = 2; i <= m; i++) {
int j = nxt[i-1];
while (j && ch[j+1] != ch[i]) j = nxt[j];
if (ch[j+1] == ch[i]) nxt[i] = j+1;
}
for (int i = 1; i <= m; i++) {
for (char j = '0'; j <= '9'; j++) {
if (j == ch[i]) continue;
int p = nxt[i-1];
while (p && j != ch[p+1]) p = nxt[p];
if (j == ch[p+1]) ++p; ++T.a[i-1][p];
}
++T.a[i-1][i];
}
}
mat quick_pow(mat a, int b) {
mat ans = a; --b;
while (b) {
if (b&1) ans = ans*a;
b >>= 1, a = a*a;
}
return ans;
}
void work() {
read(n), read(m), read(k); scanf("%s", ch+1); build();
S.a[0][0] = 1; S = S*quick_pow(T, n); int ans = 0;
for (int i = 0; i < m; i++) ans += S.a[0][i]; writeln(ans%k);
}
int main() {
work(); return 0;
}

[HNOI 2008]GT考试的更多相关文章

  1. [补档][HNOI 2008]GT考试

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

  2. BZOJ 1009 HNOI 2008 GT考试 递推+矩乘

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

  3. 【BZOJ 1005】【HNOI 2008】明明的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 答案是\[\frac{(n-2)!}{(n-2-sum)!×\prod_{i=1}^{cnt} ...

  4. 【BZOJ 1043】【HNOI 2008】下落的圆盘 判断圆相交+线段覆盖

    计算几何真的好暴力啊. #include<cmath> #include<cstdio> #include<cstring> #include<algorit ...

  5. 【BZOJ 1007】【HNOI 2008】水平可见直线 解析几何

    之前机房没网就做的这道题,用的解析几何判断交点横坐标 #include<cmath> #include<cstdio> #include<cstring> #inc ...

  6. [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...

  7. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  8. HNOI 2008:水平可见直线

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...

  9. [HNOI 2008]越狱

    Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 I ...

随机推荐

  1. 第二届强网杯-simplecheck

    这次强网杯第一天做的还凑合,但第二天有事就没时间做了(也是因为太菜做不动),这里就记录一下一道简单re-simplecheck(一血). 0x00 大致思路: 用jadx.gui打开zip可以看到,通 ...

  2. 1013团队Beta冲刺day4

    项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...

  3. 每日冲刺报告-Day3

    敏捷冲刺每日报告--Day3 情况简介 今天的任务是把json处理函数加入到爬虫中,把搜索到的结果存到json文件里去. 任务进度 赵坤:在爬虫中加入了json处理的代码,解决了在控制台打印中文列表/ ...

  4. java中<> 的用法

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...

  5. SAN LUN Mapping出错导致文件系统共享冲突,数据恢复成功

    [用户单位] 中国联通某分公司[数据恢复故障描述]    SUN 光纤存储系统,中心存储为6枚300G硬盘组成的RAID6,划分为若干LUN,MAP到不同业务的服务器上,服务器上运行SUN SOLAR ...

  6. zookeeper入门系列:概述

    zookeeper可谓是目前使用最广泛的分布式组件了.其功能和职责单一,但却非常重要. 在现今这个年代,介绍zookeeper的书和文章可谓多如牛毛,本人不才,试图通过自己的理解来介绍zookeepe ...

  7. .Net Core MongoDB 简单操作。

    一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...

  8. C# if判断语句执行顺序

    DataTable dt = null; )//不报错,因为先执行dt != null 成立时才执行dt.Rows.Count > 0 { } && dt != null)//报 ...

  9. SpringBoot14 SpringBoot整合mybatis

    1 版本说明 springboot:2.0 jdk:1.8 2 创建springBoot项目 创建项目时勾选必要web,MySQL,mybatis相关依赖 创建完成后再pom文件中添加自动部署.lom ...

  10. 【笔记】HybridApp中使用Promise化的JS-Bridge

    背景: HybridApp,前端采用JS-bridge的方式调用Native的接口,如获取设备信息.拍照.人脸识别等 前端封装了调用库,每次调用Native接口,需要进行两步操作(1.在window下 ...