P3193 [HNOI2008]GT考试

传送门

容易看出是道DP

考虑一位一位填数字

设 f [ i ] [ j ] 表示填到第 i 位,在不吉利串上匹配到第 j 位时不出现不吉利数字的方案数

设 g [ i ] [ j ] 表示不吉利串匹配到第 i 位,再添加一个数字,使串匹配到第 j 位的方案数

那么方程显然为 : 

 

注意我们不需要考虑 $j=m$ 的情况,因为 $j=m$时肯定已经出现匹配了

显然我们可以预处理出 g ,然后直接转移

最后答案就是 

 

还有一个问题,n 太大了

发现 g 是固定的,把 g 搞成矩阵直接矩阵加速一下

复杂度$ O(log_n)$

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
inline int read()
{int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=27;
int n,m,mo;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int a[N],fail[N];
char s[N];
int g[N][N];
struct matrix//矩阵不解释
{int a[N][N];matrix () { memset(a,0,sizeof(a)); }inline matrix operator * (const matrix &tmp) const {matrix res;for(int i=0;i<m;i++)for(int j=0;j<m;j++)for(int k=0;k<m;k++)res.a[i][j]=fk(res.a[i][j]+a[i][k]*tmp.a[k][j]%mo);return res;}
}F,M;
inline matrix ksm(matrix x,int y)//矩阵快速幂不解释
{matrix res;for(int i=0;i<=m;i++) res.a[i][i]=1;while(y){if(y&1) res=res*x;x=x*x; y>>=1;}return res;
}
inline void pre()//预处理,本人闲的蛋疼用kmp预处理g
{int x=0; fail[0]=-1;for(int i=1;i<=m;i++){x=fail[i-1]; while(x!=-1&&a[x+1]!=a[i]) x=fail[x];fail[i]=x+1;}fail[0]=0;for(int i=0;i<m;i++)for(int j=0;j<10;j++)//枚举填的每个数字,看看能匹配到哪里
        {x=i; while(x&&a[x+1]!=j) x=fail[x];g[i][a[x+1]==j ? x+1 : x]++;//把匹配到的位置++
        }for(int i=0;i<m;i++) for(int j=0;j<m;j++) M.a[i][j]=g[i][j];//转移矩阵就是g
}
int main()
{n=read(); m=read(); mo=read();scanf("%s",s+1);for(int i=1;i<=m;i++) a[i]=s[i]-'0'; a[m+1]=a[0]=-1;//闲的蛋疼,就是爱转数字pre(); F.a[0][0]=1;//初始状态F=F*ksm(M,n); int ans=0;for(int i=0;i<m;i++) ans=fk(ans+F.a[0][i]);printf("%d",ans);return 0;
}

 

转载于:https://www.cnblogs.com/LLTYYC/p/9907548.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题攻略

目录 一、LeetCode简介 二、刷leetcode的主要目的 三、常用的数据结构 四、常用的算法思想 五、选择算法题 1、刷题选择 2、刷题方法 方法一&#xff1a;顺序法 方法二&#xff1a;标签法 方法三&#xff1a;随机法 方法四&#xff1a;必杀法 六、刷题攻略 TIP 1&…

SQLserver数据库反编译生成Hibernate实体类和映射文件

一、建立项目和sqlserver数据库 eclipse&#xff0c;我使用的版本是neon3 二、Data Source Explorer 选择OK 在data source Explorer的Database Connections 选择New 填写好General的连接信息 新建New Driver Definition 填写完选择OK 选择刚才的Drivers Test Connetion测试 N…

最受欢迎的5大Linux发行版

摘要&#xff1a;要统计有多少人在使用那款Linux发行版几乎是不可能的事情&#xff0c;但我们可以使用一些在线分析工具来大概地看看哪些Linux发行版更受欢迎。 Google Trends的数据显示&#xff0c;Ubuntu用户正在流向Mint&#xff0c;但依然在各方面都比其它Linux发行版更有优…

C#动态操作DataTable(新增行、列、查询行、列等)

public void CreateTable(){//创建表DataTable dt new DataTable();//1、添加列dt.Columns.Add("Name", typeof(string)); //数据类型为 文本//2、通过列架构添加列DataColumn age new DataColumn("Age", typeof(Int32)); //数据类型为 整形DataColumn…

使用IntelliJ IDEA 配置Maven(入门)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 下载Maven 官方地址&#xff1a;http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径 3.配…

[算法]不使用*、/、+、-、%操作符求一个数的1/3

摘要&#xff1a;算法一直是程序员进阶的一道龙门&#xff0c;通常算法都是为了更高效地解决问题而创造的&#xff0c;但也有的只是出于学术性&#xff0c;并不在意其实际意义。这是近日在国外技术问答网站stackoverflow的一个热门问题&#xff0c;不知道你能给出几种解决方法&…

2022届互联网秋招备战

文章目录1、何为秋招&#xff1f;1.1应届生身份1.2秋招、春招、校招1.3、社招、海投2.秋招信息如何获取&#xff1f;3、如何备战秋招&#xff1f;3.1、简历&#xff08;ps做简历&#xff09;3.2、笔试准备3.3、面试准备4、日常实习和暑假实习&#xff1f;1、春招≠暑期实习2、什…

php 两变量值互换 方法

//方法一&#xff1a;$a "abc";$b"def";$a $a^$b;$b $b^$a;$a $a^$b;//方法二&#xff1a;list($a, $b) array($b, $a);//方法三&#xff1a;$a $a . $b;$b strlen( $b );$b substr( $a,0,(strlen($a)- $b ));$a substr( $a, strlen($b));//方法四&…

MySQL5.7 group by新特性,报错1055

项目中本来使用的是mysql5.6进行开发&#xff0c;切换到5.7之后&#xff0c;突然发现原来的一些sql运行都报错&#xff0c;错误编码1055&#xff0c;错误信息和sql_mode中的“only_full_group_by“关&#xff0c;到网上看了原因&#xff0c;说是mysql5.7中only_full_group_by这…

IDEA中多行注释及取消注释快捷键

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、一次性添加多行注释的快捷键 首先选中要注释区域&#xff0c;然后 ctrl/ 这个是多行代码分行注释&#xff0c;每行一个注释…

为什么程序员不擅长估算时间?

摘要&#xff1a;时间估算是困难的&#xff0c;每一个程序员都有一个现实的估计区间&#xff0c;低于这个区间的估计意味着&#xff08;构件&#xff0c;测试&#xff0c;检查代码的&#xff09;时间开销被低估了&#xff0c;超过这个区间的估计意味着这个任务太大而很难预估。…

red hat enterprise linux 7关闭防火墙的方法

2019独角兽企业重金招聘Python工程师标准>>> red hat enterprise linux 7发布后&#xff0c;发现防火墙也变了&#xff0c;如何关闭防火墙呢&#xff0c;下面是方法 1.查看firewall的状态 [rootsztech7 ~]# systemctl status firewalld firewalld.service - firewal…

IOS —— 网络那些事(上) - http协议

作为一名并不太合格的程序员&#xff0c;今天要分享学习的成果&#xff0c;竟然讲的是网络相关HTTP协议的事情。&#xff08;也算是复习了&#xff09; 乍看HTTP协议的内容着实是十分复杂的&#xff0c;涉及到十分多互联网"底层"框架的东西。今天就先撇开这部分详细内…

【最新版】Java速成路线(急于找工作!)

文章目录计算机网络分层结构TCP/UDPHTTP/HTTPS状态码Cookie 和 SessionURI和URL操作系统线程和进程数据结构和算法数据结构算法设计模式&#xff08;23种&#xff09;单例工厂代理适配器观察者模板实操工具Git/SVNMaven/GradleLinux基本操作NginxELKpostmanJAVA基础语言基础JVM…

Java Web Start实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 JWS让用户可以下载服务器端的Java Application到本机运行&#xff0c;并且没有安装、配置等繁琐的操作JWS的运行原理&#xff1a;浏览器…

老派程序员——徒手实现伟大成就

摘要&#xff1a;本文介绍了三位非常著名的程序员&#xff1a;Ken Thompson,Joe Armstrong 和 Jamie Zawinski&#xff0c;他们是如何发明一门新语言&#xff0c;他们开发软件时会像我们一样使用当今流行的开发工具吗&#xff1f;当读Peter Seibel的精彩著作《编程人生:15位软件…

互联网大厂项目研发流程

文章目录阶段一&#xff1a;阶段二&#xff1a;阶段三&#xff1a;阶段四&#xff1a;阶段五&#xff1a;开发人员&#xff1a;测试人员&#xff1a;设计师&#xff1a;阶段六&#xff1a;阶段七&#xff1a;总结&#xff1a;本文章学习自&#xff1a;https://www.bilibili.com…

centos常见错误 Failed to set locale, defaulting to C

错误描述&#xff1a; 当在centos中使用yum命令时&#xff0c;输出错误&#xff1a; [rootlocalhost yum.repos.d]# yum list |grep prceFailed to set locale, defaulting to C 用locale检测&#xff0c;出现如下提示&#xff1a; rootlocalhost yum.repos.d]# localelocale: …

图片上传知识点梳理

在日常项目开发中&#xff0c;图片上传是一个十分常见的场景。而现在的各种UI框架都提供了自己的上传组件&#xff0c;网上第三方的上传组件也多如牛毛。可能你早已习惯了直接使用这些现成的组件&#xff0c;然而对于其具体的实现&#xff0c;却并未深入解析。本文将通过简单的…

解决 java.lang.IllegalArgumentException: Repository interface must not be null on initialization!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错&#xff1a;Caused by: java.lang.IllegalArgumentException: Repository interface must not be null on initialization! Cause…