1646:GT 考试

时间限制: 1000 ms         内存限制: 524288 KB

【题目描述】

阿申准备报名参加 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

【提示】

数据范围与提示:

对于全部数据,1≤n≤109,1≤m≤20,2≤K≤1000。

sol:此题应该是先想到暴力的做法再用矩阵乘法优化的

所以暴力的思想很重要

dp[i][j]表示到第i位,匹配了j个的方案数

先预处理出f[i][j]表示已经匹配了i个,加一个数字变成匹配了j个方案数,i,j<=m-1,用kmp搞搞

转移就不难了,dp[i][j]+=dp[i-1][k]*f[k][j],是不是很像矩阵乘法2333

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,m,Mod;
int Num[],f[][];
int dp[N][M];
inline void Ad(int &x,int y)
{
x+=y;
x-=(x>=Mod)?Mod:;
return;
}
int Next[];
inline void Pre_f()
{
int i,j=;
Next[]=;
for(i=;i<=m;i++)
{
while((Num[j+]!=Num[i])&&j) j=Next[j];
if(Num[j+]==i) j++;
Next[i]=j;
}
for(i=;i<m;i++)
{
for(j=;j<=;j++)
{
int Now=i;
while((Num[Now+]!=j)&&Now) Now=Next[Now];
if(Num[Now+]==j) Now++;
f[i][Now]++;
}
}
/*
for(i=0;i<m;i++,puts(""))
{
for(j=0;j<m;j++) W(f[i][j]);
}
puts("");
*/
return;
}
int main()
{
int i,j,k,ans=;
R(n); R(m); R(Mod);
for(i=;i<=m;i++)
{
char ch=' ';
while(!isdigit(ch)) ch=getchar();
Num[i]=ch-'';
}
Pre_f();
dp[][]=;
for(i=;i<=n;i++)
{
for(j=;j<=m-;j++)
{
for(k=;k<=m-;k++)
{
Ad(dp[i][j],dp[i-][k]*f[k][j]%Mod);
}
}
}
for(i=;i<m;i++) Ad(ans,dp[n][i]);
Wl(ans);
return ;
}
/*
input
4 3 100
111
output
81
*/

暴力

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,m,Mod;
int Num[],f[][];
int ans[][],power[][],a[][],c[][];
inline void Ad(int &x,int y)
{
x+=y;
x-=(x>=Mod)?Mod:;
return;
}
int Next[];
inline void Pre_f()
{
int i,j=;
Next[]=;
for(i=;i<=m;i++)
{
while((Num[j+]!=Num[i])&&j) j=Next[j];
if(Num[j+]==Num[i]) j++;
Next[i]=j;
}
for(i=;i<m;i++)
{
for(j=;j<=;j++)
{
int Now=i;
while((Num[Now+]!=j)&&Now) Now=Next[Now];
if(Num[Now+]==j) Now++;
f[i][Now]++;
}
}
/*
for(i=0;i<m;i++,puts(""))
{
for(j=0;j<m;j++) W(f[i][j]);
}
puts("");
*/
return;
}
int main()
{
int i,j,k,Sum=;
R(n); R(m); R(Mod);
for(i=;i<=m;i++)
{
char ch=' ';
while(!isdigit(ch)) ch=getchar();
Num[i]=ch-'';
}
Pre_f();
ans[][]=;
for(i=;i<=m-;i++) power[i][i]=;
memmove(a,f,sizeof a);
while(n)
{
if(n&)
{
memset(c,,sizeof c);
for(i=;i<=m-;i++) for(j=;j<=m-;j++) for(k=;k<=m-;k++)
{
Ad(c[i][j],power[i][k]*a[k][j]%Mod);
}
memmove(power,c,sizeof power);
}
memset(c,,sizeof c);
for(i=;i<=m-;i++) for(j=;j<=m-;j++) for(k=;k<=m-;k++)
{
Ad(c[i][j],a[i][k]*a[k][j]%Mod);
}
memmove(a,c,sizeof a);
n>>=;
}
memset(c,,sizeof c);
for(i=;i<=;i++) for(j=;j<=m-;j++) for(k=;k<=m-;k++)
{
Ad(c[i][j],ans[i][k]*power[k][j]%Mod);
}
memmove(ans,c,sizeof ans);
for(i=;i<m;i++) Ad(Sum,ans[][i]);
Wl(Sum);
return ;
}
/*
input
4 3 100
111
output
81 input
1000000000 19 9973
1010100110011000001
output
5753
*/

矩阵乘法

一本通1646GT 考试的更多相关文章

  1. 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】

    1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...

  2. 20181022 考试记录&高级数据结构

    题目 W神爷的题解 高级数据结构 T1: 其实是一道easy题,$O(n^3log n)$ 也是能卡过去的,本着要的70分的心态,最后尽然A了. 如果是正解则是$O(n^3)$,当确定你要选择的列时, ...

  3. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  4. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  5. 记lrd的高二上学期第五次调研考试

    河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...

  6. 1009: [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...

  7. mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风

    (-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...

  8. js封装用户选项传递给Servlet之考试系统二

    <%@ page language="java" import="java.util.*" contentType="text/html; ch ...

  9. js动态生成选项之考试系统(一)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

随机推荐

  1. shell杂记

    (本文将持续更新)从2015年9月25日开始正式学习linux类的东西. 书籍入门:UNIX.Shell编程24学时教程(中文版).Linux与UNIX Shell编程指南.shell十三问.LINU ...

  2. easyui的datagrid

    datagrid数据的绑定方式: 1)data 后跟数据行的json串 2)url 后跟{"total":,"rows":,"foot":} ...

  3. 20155211《网络对抗》Exp02 后门原理与实践

    20155211<网络对抗>Exp02 后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 ( ...

  4. EJB开发第二期---开发具有本地接口的无状态Bean

    一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都 ...

  5. md5加密,同样的代码得到不同的加密结果(已解决)

    场景: 开发环境(windows下)调用第三方接口验签通过,发测试环境(linux下)后死活验签通过不了 原因: md5是一项成熟的加密技术,问题应该在代码里,查了查感觉可能是字符编码的问题,导致加签 ...

  6. vs编译器好多下划波浪线但不报错

    解决办法:项目属性->c/c++->常规->附加包含目录->$(ProjectDir): $(ProjectDir) 项目的目录(定义形式:驱动器 + 路径):包括尾部的反斜杠 ...

  7. C#中二进制、十进制和十六进制互相转换的方法

    二进制在C#中无法直接表示,我们一般用0和1的字符串来表示一个数的二进制形式.比如4的二进制为"100".下面介绍C#里面用于进制转换的方法. 十进制转换为二进制(int--> ...

  8. 调用wx.request接口时需要注意的几个问题

    写在前面 之前写了一篇<微信小程序实现各种特效实例>,上次的小程序的项目我负责大部分前端后台接口的对接,然后学长帮我改了一些问题.总的来说,收获了不少吧! 现在项目已经完成,还是要陆陆续续 ...

  9. 设计模式 笔记 生成器(建造者)模式 Builder

    //---------------------------15/04/08---------------------------- //builder 生成器(建造者)模式---对象创建型模式 /* ...

  10. Scrapyd+Gerapy部署Scrapy爬虫进行可视化管理

    Scrapy是一个流行的爬虫框架,利用Scrapyd,可以将其部署在远程服务端运行,并通过命令对爬虫进行管理,而Gerapy为我们提供了精美的UI,可以在web页面上直接点击操作,管理部署在scrap ...