一本通1646GT 考试
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 考试的更多相关文章
- 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】
1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...
- 20181022 考试记录&高级数据结构
题目 W神爷的题解 高级数据结构 T1: 其实是一道easy题,$O(n^3log n)$ 也是能卡过去的,本着要的70分的心态,最后尽然A了. 如果是正解则是$O(n^3)$,当确定你要选择的列时, ...
- 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd
题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...
- 全网独家MongoDB Certified DBA Associate考试认证视频
该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...
- 记lrd的高二上学期第五次调研考试
河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
(-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...
- js封装用户选项传递给Servlet之考试系统二
<%@ page language="java" import="java.util.*" contentType="text/html; ch ...
- js动态生成选项之考试系统(一)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
随机推荐
- 前尘浮华一场梦 NOI2018 游记
前尘浮华一场梦 NOI2018 哦?我摆弄着手中的键盘,看起来,是要我离开吗?好吧,对于每一个OIer的年,都是以NOI开始,以NOI结束的啊…这个年过的,可不是那么让人舒服呢… 你想听那个人的故事? ...
- MFC 用ShellExecute打开外部文件
知识点: 获取CListCtrl选中文本 用ShellExecute打开外部文件 一.CListCtrl::GetFirstSelectedItemPosition CListCtrl::GetFir ...
- SQLAlchemy 关联表删除实验
本实验所用代码来源于官网文档 from sqlalchemy import Table, Column, Integer, String, ForeignKey from sqlalchemy.orm ...
- libgdx判断actor与circle是否重叠
实质是检测矩形与circle是否重叠 基本函数,判断点是否在circle中 public static boolean IsInside( float x, float y, Circle circl ...
- [arc102E]Stop. Otherwise...[容斥+二项式定理]
题意 给你 \(n\) 个完全相同骰子,每个骰子有 \(k\) 个面,分别标有 \(1\) 到 \(k\) 的所有整数.对于\([2,2k]\) 中的每一个数 \(x\) 求出有多少种方案满足任意两个 ...
- ElasticSearch查询 第三篇:词条查询
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- 简单模拟flume
NetCat方式: 远程访问的方式进行消息传递 配置一个Agent,主要配置三个组件: source, channel, sink 上图中为什么channel会带s,变成channels? 可以绑定多 ...
- LintCode——旋转字符串
描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例:对于字符串 "abcdefg" offset=0 => "abcdefg&qu ...
- Ubuntu 18.04下Couldn't connect to Docker daemon at http+docker://localunixsocket解决办法
一台服务器系统为:Ubuntu 18.04 LTS,上面建了git裸仓库,用于开发吧代码push到这里.同时WEB测试环境通过docker也部署在这台.通过git钩子post-receive,当有新代 ...
- PAT甲级题解-1047. Student List for Course (25)-排序
一开始是建立了course[2501][40001]数组,存储每节课的学生编号然后for循环两层输出,但这样复杂度为O(2500*40000),也很明显导致最后时间超时后来发现最多40000学生,每个 ...