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. PAT B1040 有几个PAT (25 分)

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...

  2. char a='1'和char a=1区别

    char a='1'表示:把字符为1,ASSIC码为49的值赋值给a: char a= 1表示:把ASSIC码为1的值赋值给a

  3. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  4. day11有参装饰器,无参装饰器

    今日内容 1.有参装饰器 2.无参装饰器 什么是装饰器? 用来为被装饰对象添加新功能的工具. 注:装饰器可以是任意可调用对象,被装饰对象也可以是任意可调用对象. 为何要用装饰器? 开放封闭原则:对修改 ...

  5. 将EF项目从dbfirst转化为codefirst

    一个脚本服务的项目,之前是先设计的数据库表,采用EF的dbfirst做的映射.项目完成后,出现迁移瓶颈. 1.dbfirst项目,如果数据库表结构做了调整,需要重新映射 2.当出现表结构一致,但数据库 ...

  6. Ubuntu下搭建Ruby On Rails

    Ruby on Rails是一个非常高效的Web应用程序框架由David Heinemeier Hansson使用Ruby语言编写. 这是一个开源 Ruby 框架,用于开发数据库支持的Web应用程序. ...

  7. 在 R 中估计 GARCH 参数存在的问题

    目录 在 R 中估计 GARCH 参数存在的问题 GARCH 模型基础 估计 GARCH 参数 fGarch 参数估计的行为 结论 译后记 在 R 中估计 GARCH 参数存在的问题 本文翻译自< ...

  8. java 锁白话

    一.锁 1.可见性: 定义:数据对所有线程可见 原因:cpu操作数据时会把数据读取到内存中去,可以理解为值做了备份,但是备份数据和原始数据在后续操作中不一定一致 实现:java使用volite关键字来 ...

  9. 原创zynq文章整理(MiZ702教程+例程)

    MiZ702教程+例程  网盘链接:  http://pan.baidu.com/s/1sj23yxv 不时会跟新版本,增加勘误之类的,请关注--

  10. Jq_Js_Js、Jq获取浏览器和屏幕各种高度宽度

    $(document).ready(function()         {alert($(window).height()); //浏览器当前窗口可视区域高度alert($(document).he ...