题目传送门

题目大意

给出\(n,m,k\),以及一个长度为\(m\)的数字串\(s_{1,2,...,m}\),求有多少个长度为\(n\)的数字串\(X\)满足\(s\)不出现在其中的个数模\(k\)的答案。

思路

看\(\texttt{command-block}\)的博客看到这道题了,果然还是不会做,看了一下题解,确实自己技不如人。。。

我们可以设\(f[i][j]\)表示考虑到第\(i\)个数,匹配到\(s\)的第\(j\)位的方案数。可以得到一个非常显然的转移式:

\[f[i][j]=\sum_{k=0}^{m-1} f[i][k]g[k][j]
\]

其中\(g[k][j]\)表示\(s\)匹配到第\(k\)位,加一个数字匹配到第\(j\)位的方案数。

不难看出最后的答案就是:

\[\sum_{i=0}^{m-1}f[n][i]
\]

于是,我们的问题就是如何求出\(g\)了。我们发现这个可以\(\texttt{KMP}\)暴艹出来。于是,我们就可以用矩阵加速求出\(f\)了。

时间复杂度为\(\Theta(m^3\log n)\)。

\(\texttt{Code}\)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 25 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int n,m,mod,fail[MAXN];char s[MAXN];
int mul (int a,int b){return a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;} struct Matrix{
int val[MAXN][MAXN];
Matrix(){memset (val,0,sizeof (val));}
int* operator [] (int x){return val[x];}
Matrix operator * (const Matrix &p)const{
Matrix New;
for (Int i = 0;i < m;++ i) for (Int k = 0;k < m;++ k) for (Int j = 0;j < m;++ j) New[i][j] = add (New[i][j],mul (val[i][k],p.val[k][j]));
return New;
}
Matrix operator ^ (int b){
Matrix res,a = *this;
for (Int i = 0;i < m;++ i) res[i][i] = 1;
for (;b;b >>= 1,a = a * a) if (b & 1) res = res * a;
return res;
}
}A; signed main(){
read (n,m,mod),scanf ("%s",s + 1);
for (Int i = 2,j = 0;i <= m;++ i){
while (j && s[j + 1] != s[i]) j = fail[j];
if (s[j + 1] == s[i]) ++ j;
fail[i] = j;
}
for (Int i = 0;i < m;++ i)
for (char c = '0';c <= '9';++ c){
int j = i;
while (j && s[j + 1] != c) j = fail[j];
if (s[j + 1] == c) ++ j;
++ A[i][j];
}
A = A ^ n;int sum = 0;
for (Int i = 0;i < m;++ i) sum = add (sum,A[0][i]);
write (sum),putchar ('\n');
return 0;
}

题解 GT考试的更多相关文章

  1. 竞赛题解 - NOIP2018 赛道修建

    \(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...

  2. CSP-J 2020题解

    CSP-J 2020题解 本次考试还是很有用的,至少把我浇了一盆冷水. 当使用民间数据自测的时候,我就自闭了. 估分是320,但有些比较低级的错误直接少掉80. 而且这套题应该上350才正常吧,也不是 ...

  3. jsoi2015 R2——滚粗记

    考完感觉各种绝望溢出胸口,作为百度空间的最后一篇文章了吧 day 0 第二轮在南师附中……不能到外地玩了…… 其实在试机的时候就感觉不大对头,明明说好18:15试机结果拖到18:30…… 还有今年竟然 ...

  4. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  5. 【BZOJ4738/UOJ#276】汽水(点分治,分数规划)

    [BZOJ4738/UOJ#276]汽水(点分治,分数规划) 题面 BZOJ UOJ 题解 今天考试的题目,虽然说是写完了,但是感觉还是半懂不懂的来着. 代码基本照着\(Anson\)爷的码的,orz ...

  6. [Codeforces526F]Pudding Monsters 分治

    F. Pudding Monsters time limit per test 2 seconds memory limit per test 256 megabytes In this proble ...

  7. 【BZOJ2423】最长公共子序列(动态规划)

    [BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...

  8. 【BZOJ3609】人人尽说江南好(博弈论)

    [BZOJ3609]人人尽说江南好(博弈论) 题面 BZOJ 洛谷 题解 昨天考试的时候,毒瘤出题人出了一个\(noip\)博弈十合一然后他就被阿鲁巴了,因为画面残忍,就不再展开. 这题是他的十合一中 ...

  9. [BZOJ3195][Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小宇从历史书上了解到一个古老的文明.这个文明在各个 ...

随机推荐

  1. Python3-sqlalchemy-orm 联表查询-无外键关系

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  2. 1.3w字,一文详解死锁!

    死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...

  3. Linux(一)——简介

    aaa https://www.cnblogs.com/three-fighter/p/14644152.html#navigator

  4. 20210804 noip30

    考场 第一眼感觉 T1 是状压 DP,弃了.T2 好像也是 DP???看上去 T3 比较可做. 倒序开题.T3 暴力是 \(O(pn\log p)\)(枚举 \(x\),二分答案,看能否分成合法的不超 ...

  5. junit5 yaml和json 数据驱动

    使用yaml 数据驱动测试 新建用例数据类,用于动态修改测试数据 对应yaml文件,第一层结构为列表 第二层结构为具体序列化class对象 测试成功 public class TestYaml { @ ...

  6. 全网唯一正常能用的centos7 安装mysql5.7.35 22 33 25

    CentOS7.4用yum安装并配置MySQL5.7   1.配置YUM源 下载MySQL源安装包 wget http://dev.mysql.com/get/mysql57-community-re ...

  7. Java日期时间API系列42-----一种高效的中文日期格式化和解析方法

    中文日期(2021年09月11日 和 二〇二一年九月十一日 )在生活中经常用到,2021年09月11日很好处理直接使用模板:yyyy年MM月dd日:二〇二一年九月十一日比较不好处理,需要每个数字进行转 ...

  8. k8s nodes节点 notready问题

    1.在master查看node状态 [root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready co ...

  9. vue中的watch

    1.第一种 watch:{ total:{ // total:要检测的数据   handler:(val,oldVal)=>{ // handler方法自动执行   }, deep:true / ...

  10. scrum项目冲刺_day09总结

    摘要:今日完成任务. 1.短信服务完成(由于使用免费的接口,导致部分手机会收到垃圾短信) 2.注册登录完成 3.导航还在进行 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能( ...