[HNOI2008] GT考试
[HNOI2008] GT考试
标签 : DP 矩阵乘法
题意
n位数中不出现一个子串的方案数。
题解
\(设dp[i][j]\)为前i位匹配到j时的合法方案数。(所谓合法,就是不能有别的匹配更多或相同)
然后显然\(dp[i][j]=dp[i-1][k]×a[k][j],a[k][j]\)代表从k位加一个数字j的数字个数。
然后这是一个线性的递推,直接上矩阵加速。
最后要求的答案就是 \(\sum_{i=0}^{m-1} dp[n][i]\)。
Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{
int sum=0,p=1;char ch=getchar();
while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
if(ch=='-')p=-1,ch=getchar();
while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum*p;
}
const int maxn=52;
int n,m,mod;
struct matrix {
int n,m;
int g[52][52];
void Matrix()
{
n=m=0;memset(g,0,sizeof(g));
}
matrix operator * (matrix a)const
{
matrix b;
b.Matrix();
b.n=n;b.m=a.m;
REP(i,0,b.n-1)
{
REP(j,0,b.m-1)
{
REP(k,0,m-1)b.g[i][j]=(b.g[i][j]+g[i][k]*a.g[k][j])%mod;
}
}
return b;
}
};
char str[maxn];int nxt[maxn];
matrix make_new()
{
matrix a;
a.Matrix();
a.n=a.m=m;
REP(i,0,m-1)
{
REP(j,0,9)
{
int x=i;
while(x && str[x+1]-'0'!=j)x=nxt[x];
if(str[x+1]-'0'==j)a.g[i][x+1]++;
else a.g[i][0]++;
}
}
return a;
}
void init()
{
n=read();m=read();mod=read();
cin>>(str+1);
str[0]='-';
nxt[1]=0;
REP(i,2,m)
{
int j=nxt[i-1];
while(j && str[j+1]!=str[i])j=nxt[j];
if(str[j+1]==str[i])nxt[i]=j+1;
else nxt[i]=0;
}
}
matrix Init(int n)
{
matrix c;
c.Matrix();
c.n=c.m=n;
REP(i,0,n-1)c.g[i][i]=1;
return c;
}
void doing()
{
matrix ans=Init(m),a=make_new();
int k=n;
while(k)
{
if(k & 1)ans=ans * a;
k>>=1;
a=a * a;
}
ll anss=0;
REP(i,0,m-1)anss=(anss+ans.g[0][i])%mod;
cout<<anss<<endl;
}
int main()
{
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
init();
doing();
return 0;
}
[HNOI2008] GT考试的更多相关文章
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- 【bzoj1009】[HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3018 Solved: 1856[Submit][Statu ...
- BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj1009 / P3193 [HNOI2008]GT考试
P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
随机推荐
- putty怎么用?如何使用Putty远程管理Linux主机
Putty是一个免费的Windows 32平台下用于telnet.rlogin和ssh客户端的远程客户端工具,可以通过PUTTY快速的实现SSH连接linux等主机,下面小编就给大家演示一下如何使用P ...
- 半透明边框与background-clip
在开始本章之前,我们要先简单介绍CSS中的半透明颜色.自2009年后,网页工作者们开始使用半透明颜色,如rgba().hsla().前者相信大家都很熟悉,不难理解其中将有四个参数,第四个参数则为透明度 ...
- sass和compass实战 读书笔记(一)
sass优势: 不做重复的工作 一 消除样式表冗余(通过变量赋值的方式) 1. 通过变量来复用属性值 2. 使用嵌套来快速写出多层级的选择器 3. 通过混合器来复用一段样式 4. 使用选择器继承来避 ...
- k8s 如何 Failover?- 每天5分钟玩转 Docker 容器技术(127)
上一节我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上.现在模拟 k8s-node2 故障,关闭该节点. 等待一段时间,Kubernetes 会检查到 k8s ...
- $.ajax()实现简单计算器
1.html页面 a.html <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 浅谈python lambda
lambda x: x * x,实际上就是 def f(x): retrun x * x 关键字lambda表示匿名函数,冒号前的x表示函数参数. 匿名函数只能有一个表达式,不用写return,返回值 ...
- [PHP] Phalcon操作示范
这篇内容将对下列操作进行示范: Insert.Select.Update.Calculation.Transaction.models advanced.dev-tools.cookies [ Ins ...
- [Bug] 解决 Sql Server 数据库死锁问题
SELECT request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tra ...
- C#中的out参数/ref参数/params可变参数
out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...
- PyCharm配置autopep8,自动格式化Python代码
1. 关于PEP 8 PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 官网地址:h ...