题目背景

P哥是一个经常丢密码条的男孩子。

在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码。

题目描述

定义一个串合法,当且仅当串只由A和B构成,且没有连续的3个A。P哥知道,密码就是长度为N的合法字符串数量对19260817取模的结果。但是P哥不会算,所以他只能把N告诉你,让你来算

至于为什么要对这个数取模,好像是因为纪念某个人,但到底是谁,P哥也不记得了

然而他忘记字符串长度N应该是多少了,于是他准备试M组数据。

题目解析

WA了两次。

递推题,在长度为n-1的合法串中有这几种:末尾有连续2个A,末尾有1个A,末尾不是A。

然后稍加思考就可以发现在长度为n的串中末尾连续2个A的可以由长度为n-1的合法串中末尾是1个A的得到。

类似的,末尾一个A的可以由末尾没有A的得到,末尾是B的能由所有状态得到。

所以我们构造出下面的矩阵三行分别表示末尾是B,末尾1个A,末尾2个A。

1,1,1

1,0,0

0,1,0

矩阵快速幂+取模即可。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const long long p = ; struct Matrix {
long long m[][];
long long sizx,sizy;
void reset() {
for(int i = ;i <= sizx;i++) {
for(int j = ;j <=sizy;j++) {
if(i == j) m[i][j] = ;
else m[i][j] = ;
}
}
return;
}
void clean() {
memset(m,,sizeof(m));
return;
}
} pro; int T;
long long n,ans;
/*
1,1,1
1,0,0
0,1,0
*/
inline void init() {
pro.sizx = , pro.sizy = ;
pro.clean();
pro.m[][] = pro.m[][] = pro.m[][] = pro.m[][] = pro.m[][] = ;
return;
} inline Matrix mul(Matrix x,Matrix y) {
Matrix res;
res.clean();
res.sizx = x.sizx, res.sizy = y.sizy;
for(register int i = ;i <= x.sizx;i++) {
for(register int j = ;j <= y.sizy;j++) {
for(register int k = ;k <= x.sizy;k++) {
res.m[i][j] += x.m[i][k] * y.m[k][j] % p;
res.m[i][j] %= p;
}
}
}
return res;
} inline Matrix quick_pow(Matrix x,long long y) {
Matrix res;
res.sizx = x.sizx; res.sizy = x.sizy;
res.reset();
while(y) {
if(y & ) res = mul(res,x);
x = mul(x,x);
y >>= ;
}
return res;
} int main() {
scanf("%d",&T);
while(T--) {
scanf("%lld",&n);
if(n == ) {puts("");continue;}
else if(n == ) {puts("");continue;}
else if(n == ) {puts("");continue;}
init();
Matrix final = quick_pow(pro,n);
printf("%lld\n",(final.m[][]+final.m[][])%p);
}
return ;
}

[Luogu] P4838 P哥破解密码的更多相关文章

  1. 【题解】Luogu P4838 P哥破解密码

    原题传送门 考虑一个一个将字母加入字符串后面 设\(f[i][0/1/2]\)表示长度为\(i\)字符串末尾有\(0/1/2\)个A的种类数 易知: \(f[1][0]=1,f[1][1]=1,f[1 ...

  2. P4838 P哥破解密码

    题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...

  3. 洛谷 P4838 P哥破解密码 题解

    矩阵乘法 + 快速幂优化递推: 看到这个题目我们不难想到递推,题干中说3个连续的A出现在序列中是不合法的,所以可以分为三种情况: (1):序列前只有一个A,如:BA,BBA,BABA. (2):序列前 ...

  4. [洛谷P4838]P哥破解密码

    题目大意:求长度为$n$的$01$串中,没有连续至少$3$个$1$的串的个数 题解:令$a_1$为结尾一个$1$的串个数,$a_2$为结尾两个$1$的串的个数,$b$为结尾是$0$的串的个数.$a_1 ...

  5. 【洛谷T37388】P哥破解密码

    原题图: 看到这个题,首先想到的当然是暴力打表找规律了 表: 1 2 2 4 3 7 4 13 5 24 6 44 7 81 8 149 9 274 10 504 11 927 12 1705 13 ...

  6. 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?

    作者:Cascade链接:https://www.zhihu.com/question/21231074/answer/20701124来源:知乎著作权归作者所有,转载请联系作者获得授权. 想要理解G ...

  7. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...

  8. 破解密码那些事儿(Hacking Secret Ciphers with Python)

    作者:Al Sweigart   我们在电视和电影里头经常能够看到黑客们兴奋的快速敲击键盘,接着毫无意义的数字就在屏幕上飞奔(比如黑客帝国).然后让大家产生了一种奇妙的错觉,做黑客是一件高大上的事情, ...

  9. Linux_破解密码-营救模式

    实验用机:CentOS 5.7 破解密码 设置开机启动界面 系统运行级别 营救模式 一.破解密码 root用户可以更改任何用户的密码,普通用户只能修改自己的密码. 步骤: 1.重新启动系统 2.开机倒 ...

随机推荐

  1. bzoj 4071: [Apio2015]巴邻旁之桥【splay】

    用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...

  2. 【爬坑系列】之解读kubernetes的认证原理&实践

    对于访问kube-apiserver模块的请求来说,如果是使用http协议,则会顺利进入模块内部得到自己想要的:但是如果是用的是https,则能否进入模块内部获得想要的资源,他会首先要进行https自 ...

  3. 机器学习基础算法__python实现(基于numpy等基础库)

    # 博客转自https://blog.csdn.net/weixin_39561100/article/details/80879211 主要是将<机器学习实战>中的算法实现一遍,后续会慢 ...

  4. 使用方向变换(directional transform)图像分块压缩感知

    论文的思路是先介绍分块压缩感知BCS,然后介绍使用投影和硬阈值方法的迭代投影方法PL,接着将PL与维纳滤波器结合形成SPL(平滑PL),并且介绍了稀疏表示的几种基,提出了两种效果较好的稀疏基:CT与D ...

  5. [BZOJ1382]Mars Maps

    Description In the year 2051, several Mars expeditions have explored different areas of the red plan ...

  6. String Mark Codeforces - 895D

    一看好像会做的样子,就去做了一下,结果 猝不及防地T掉了 赶紧查了一下,没有死循环,复杂度也是对的,无果,于是翻了题解 题解没看懂,但是找到了标程,然后发现我被卡常了... 而且好像当时还过了前10个 ...

  7. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  8. 题解报告:hdu 1431 素数回文

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说 ...

  9. [译]curl_multi_add_handle

    NAMEcurl_multi_add_handle - add an easy handle to a multi session添加easy handle到multi session中 SYNOPS ...

  10. Android开发中使用代码删除数据库

    更多信息参考:Android开发中使用代码删除数据库 在Android开发中,如果用到数据库,就会有一个很麻烦的问题,就是有时候需要删除数据库很麻烦,要打开Android Device Monitor ...