GT考试 BZOJ 1009
GT考试
【问题描述】
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0
【输入格式】
第一行输入N,M,K.接下来一行输入M位的数。
【输出格式】
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
【样例输入】
4 3 100
111
【样例输出】
81
【数据范围】
N<=10^9, M<=20, K<=1000
题解:
设f[i][j]表示至准考证号前i位,最多匹配到不吉利数的第j位的方案数
设a[i][j]表示在不吉利数的前i位后加上一个字符能匹配到不吉利数的第j位的字符的数量(枚举字符用KMP求出a矩阵)
那么转移方程:

答案:

发现转移方程可以用矩阵乘法优化
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n, m, t, mo, sum, s[], ne[];
struct ccc
{
int v[][];
ccc()
{
memset(v, , sizeof(v));
}
friend ccc operator * (ccc a, ccc b)
{
ccc ans;
for(int i = ; i < m; ++i)
for(int j = ; j < m; ++j)
for(int k = ; k < m; ++k)
ans.v[i][j] = (ans.v[i][j] + a.v[i][k] * b.v[k][j]) % mo;
return ans;
}
friend ccc operator ^ (ccc a, int b)
{
ccc ans;
for(int i = ; i <= m; ++i) ans.v[i][i] = ;
for(int i = b; i; i >>= , a = a * a)
if(i & )
ans = ans * a;
return ans;
}
};
ccc a, c;
int main()
{
scanf("%d%d%d", &n, &m, &mo);
getchar();
for(int i = ; i <= m; ++i) s[i] = getchar() - '';
t = ;
for(int i = ; i <= m; ++i)
{
while(t > && s[i] != s[t + ]) t = ne[t];
if(s[i] == s[t + ]) ++t;
ne[i] = t;
}
for(int i = ; i < m; ++i)
for(int j = ; j <= ; ++j)
{
t = i;
while(t > && s[t + ] != j) t = ne[t];
if(s[t + ] == j) ++t;
if(t != m) a.v[t][i] = (a.v[t][i] + ) % mo;
}
for(int i = ; i < m; ++i)
{
for(int j = ; j < m; ++j)
printf("%d ", a.v[i][j]);
printf("\n");
}
c = a ^ n;
for(int i = ; i < m; ++i) sum = (sum + c.v[i][]) % mo;
printf("%d", sum);
}
GT考试 BZOJ 1009的更多相关文章
- AC日记——[HNOI2008]GT考试 bzoj 1009
1009 思路: KMP上走DP(矩阵加速): DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数: 代码: #include <bits/stdc++.h> using ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- BZOJ 1009 GT考试
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- BZOJ 1009 HNOI 2008 GT考试 递推+矩乘
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3679 Solved: 2254[Submit][Statu ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- GT考试(bzoj 1009)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- BZOJ 1009 【HNOI2008】 GT考试
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
随机推荐
- SQLite C/C++ 教程
目录 1安装 2 C/C++ Interface APIs 3连接到数据库 4创建表 5插入操作 6更新操作 7删除操作 安装 在我们开始使用SQLite在C / C++程序,我们需要确保SQLite ...
- IOS音频视频
视频播放 MediaPlayer.framework MPMoviePlayerViewController VS MPMoviePlayerController MPMoviePlayerViewC ...
- websocket 入门
什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器. 为什么会出现 webs ...
- Python IDE推荐
八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...
- shell脚本,录制和回放终端的小工具script。
action.log和time.log这两个配置文件被当做script命令的参数.这两个文件可以随便命名.这里用time.log和action.log.其中time.log用于存储时序信息,描述每一个 ...
- Xcode中的约束用法
这篇文章用几个简单的例子来介绍XCode6.1故事板中约束的使用方法. 现在iOS设备屏幕的尺寸也有很多种了,尤其是有了iPhone6 Plus以后,再不关注界面的尺寸适配就有点说不过去了. ...
- Day16模块
Day16 当做执行文件时 __name__ = "__main__" 当做模块被导入时 __name__ 等于文件名即模块名 ```python 循环导入(模块的名称空间已经建立 ...
- 求分数序列的前n项之和
有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和. 输入 测试数据有多组,其第一行为一个正整数k(0<k<=90),表示测试数据的 ...
- Codeforces Round #877 (Div. 2) B. - Nikita and string
题目链接:http://codeforces.com/contest/877/problem/B Nikita and string time limit per test2 seconds memo ...
- JavaScript正则表达式-非捕获性分组
非捕获性分组定义子表达式可以作为整体被修饰但是子表达式匹配结果不会被存储. 非捕获性分组通过将子表达式放在"?:"符号后. str = "img1.jpg,img2.jp ...