博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2008]GT考试
阅读量:5218 次
发布时间:2019-06-14

本文共 1671 字,大约阅读时间需要 5 分钟。

 

emm。。。这篇博文,不知道为啥。。。被博客园私吞了。。。我没发出来。。。

今天来补一下。。。QVQ

这个题是一个 KMP+矩阵快速幂 的恶心题目。。。QVQ

写题解也比较麻烦吧。。。

 通过分析题目我们可以发现这个题如果转换为求准考证号有多少段等于不吉利数字。。。

大家肯定都会吧。。。QVQ

轻松加愉快的一个 KMP 写上。。。

接下来我们讨论递推式子怎么写。。。QVQ

我们设一个数组 f [ i , j ]

表示,到了第 i 位,前面有 j 位不吉利数字匹配,有 f [ i , j ] 个方案。。。

以样例为例

假使我们现在查到 f [ i , 2 ]

那么我们接下来就需要讨论了。。。

如果下一位取到 1 那么我们就有 f [ i+1 , 3 ] += f [ i , 2 ]

如果下一位不取 1 那么我们就有 f [ i+1 , 0 ] += f [ i , 2 ]

那么当 j == 3 时这个状态是不合法的。。。那么我们不统计就好了。。。

这时候本蒟蒻想到了个好东西。。。矩阵快速幂。。。

对于每个合法的状态,在矩阵相应的位置++

然鹅,看大佬的博客说这个东西是必须的。。。要不然不过。。。

更具体的请参悟代码。。。QVQ

呆码:

#include
#include
#include
using namespace std;int n,m,mo,next[25];char ch[25];struct asd{ int m[25][25];} a,b;inline asd mul(asd a,asd b){ asd ans; memset(ans.m,0,sizeof(ans.m)); for(int i=0;i<=m-1;i++) for(int j=0;j<=m-1;j++) { for(int k=0;k<=m-1;k++) ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mo; } return ans;}inline void qmo(){ while(n) { if(n&1) { a=mul(a,b); n--; } b=mul(b,b); n>>=1; }}int main(){ scanf("%d%d%d",&n,&m,&mo); scanf("%s",ch+1); int k=0; for(int i=2;i<=m;i++) { while(k && ch[k+1]!=ch[i]) k=next[k]; if(ch[k+1]==ch[i]) k++; next[i]=k; } for(int i=0;i<=m-1;i++) for(int j=0;j<=9;j++) { k=i; while(k && ch[k+1]-'0'!=j) k=next[k]; if(ch[k+1]-'0'==j) k++; if(k!=m) b.m[k][i]=(b.m[k][i]+1)%mo; } for(int i=0;i<=m-1;i++) a.m[i][i]=1; qmo();// for(int i=0;i
GT考试

 

转载于:https://www.cnblogs.com/zzzyc/p/8868610.html

你可能感兴趣的文章
多线程之NSOperation小结
查看>>
What should every JavaScript programmer know?
查看>>
第三章=》基本概念
查看>>
六、CXF的使用
查看>>
springMVC 上传下载文件
查看>>
[SDOI2010]星际竞速
查看>>
Java8新特性(一)概览
查看>>
Maven学习:项目之间的关系
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
20170817上课笔记
查看>>
makefile中使用变量
查看>>
CopyOnWriteArrayList
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
3.3.5 查询的参数传递
查看>>
用C#读取相片(JPG图片)的EXIF信息的方法
查看>>
JavaScript 鸭子模型
查看>>
PHP典型功能与Laravel5框架开发学习笔记
查看>>
PInvoke.net Visual Studio Extension
查看>>