洛谷 P4838 P哥破解密码 题解
矩阵乘法 + 快速幂优化递推:
看到这个题目我们不难想到递推,题干中说3个连续的A出现在序列中是不合法的,所以可以分为三种情况:
(1):序列前只有一个A,如:BA,BBA,BABA。
(2):序列前有两个A,如:BAA,BBAA,BABAA。
(3):序列前没有A而是B,如:BB,AB,AABAAB。
我们将这三种情况分别用 a1 , a2 , b 表示。
// a1:1 1 2 4 7 13 24 44 81 149 274
// a2:0 1 1 2 4 7 13 24 44 81 149 274
// b :1 2 4 7 13 24 44 81 149 274
我们不难发现在下一轮加A或加B时:a1可以转化为a2,a1和a2都可以转化为b,而b又可以转化为a1或再加一个b不变;
故规律为:
// f=a2;
// a2=a1;
// a1=b;
// b=(a1+a2+f)%19260817;
注意变量会相互覆盖掉,f是借来存值的;
这是代码:
#include<iostream>
using namespace std;
int m,n,i,a1,a2,b1,f;
int main(){
cin>>m;
while(m--){
cin>>n;
a1=1;b1=1;a2=0;
for(i=2;i<=n;i++){
f=a2;a2=a1;a1=b1;
b1=(a1+a2+f)%19260817;
}
cout<<(a1+a2+b1)%19260817<<endl;
}
return 0;
}
但是!
这题如果这么简单也就不会是蓝题了(其实上面那个代码也能拿80分的)。
我们知道一般递推复杂度为o(n),而这题数据范围中n<=(10^9),还可以问十次,绝对会超时的!
这里提供两种优化方案:
(1):
注:这是个打表的不正经的超有用的骗满分的暴力的方法:
测评姬只给你一秒时限,但你可以在自己电脑上算很久都没问题。
所以你可以在电脑上先算出从一开始每隔(10^7)位的三个递推数;当程序读入n时找到离n最近的递推数开始递推。
简单来说就是你可以在数组中先存下(108)的三个递推数a1,a2和b,这样就能直接从(108)开始递推到n;估计能比正解还快不少!
(2):
注:其实这里才进入主题,上面可以当做都是准备工作。
注:本蒟蒻也是今天才了解矩乘优化的QAQ,若有写的不好的地方各位大佬见谅。
我们先来了解一下矩阵:
矩阵就是一个二维方阵,矩阵A的第i行第j列可用A(i,j)来表示.
一个n行m列的矩阵A就是这样:
A(1,1) A(1,2) A(1,3) ... A(1,m)
A(2,1) A(2,2) A(2,3) ... A(2,m)
A(3,1) A(3,2) A(3,3) ... A(3,m)
...
A(n,1) A(n,2) A(n,3) ... A(n,m)
而矩阵乘法就是矩阵的一种运算
那么矩阵乘法的对象就是两个矩阵A和B,
注意:矩阵A的列数要与矩阵B的行数相等!
那么运算的答案矩阵C的第i行第j列即为:
C(i,j)=A(i,1)B(1,j)+A(i,2)B(2,j)+...+A(i,p)*B(p,j);
如下:
int jucheng(int n,int p,int m){
memset(c,0,sizeof(c));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)//p为矩阵A的列数与矩阵B的行数
for (int k=1;k<=p;k++) //枚举的所有递推数
c[i][j]+=a[i][k]*b[k][j] //公式
}
矩阵乘法不满足交换律,但满足结合律.
AB!=BA
(AB)C=A(BC)
矩阵乘法也可以同余.
而当我们将矩阵乘法用到递推中时:
举一例:斐波那契数列:f[i]=f[i-1]+f[i-2].
把它用矩阵乘法表示:
// A(1,1) A(1,2)
// [0 1]* =[1 1]
// A矩阵 A(2,1) A(2,2) C矩阵
// B矩阵
不难根据公示得出B矩阵为
0,1
1,1
故递推矩阵为:
// 0 1
//[ f[i] f[i+1] ]* =[ f[i+1] f[i]+f[i+1] ]=[ f[i+1] f[i+2] ]
// 1 1
而本题中的递推矩阵为:
1,1,1
1,0,0
0,1,0
本题大意就是要将此矩阵反复乘n次。这就可以用快速幂了!
下面现上代码:
#include<bits/stdc++.h>
using namespace std;
struct ju{
long long s[3][3];
};
ju cheng(ju a,ju b){//矩乘函数:
ju c;
for(int i=0;i<3;i++)for(int j=0;j<3;j++)c.s[i][j]=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
c.s[i][j]+=a.s[i][k]*b.s[k][j],c.s[i][j]%=19260817;
return c;
}
ju fast(int n){//快速幂:
ju c,d;
c.s[0][0]=c.s[0][1]=c.s[0][2]=c.s[1][0]=c.s[2][1]=1;
c.s[1][1]=c.s[1][2]=c.s[2][0]=c.s[2][2]=0;
if(n==1)return c;//
d=fast(n/2);//这个很关键
if(n%2==0)return cheng(d,d);
return cheng(cheng(d,d),c);//多了一个1要再多乘1次
}
void print(ju n){// 输出:
cout<<(n.s[0][0]+n.s[0][1])%19260817<<endl;
}
int main(){
int m,n;
cin>>m;
while(m--){//一个一个算:
cin>>n;
print(fast(n));
}
return 0;//圆满
}
码字挺累的(手残党,码了两小时了QAQ),大家点个赞再走吧。
洛谷 P4838 P哥破解密码 题解的更多相关文章
- [洛谷P4838]P哥破解密码
题目大意:求长度为$n$的$01$串中,没有连续至少$3$个$1$的串的个数 题解:令$a_1$为结尾一个$1$的串个数,$a_2$为结尾两个$1$的串的个数,$b$为结尾是$0$的串的个数.$a_1 ...
- 【题解】Luogu P4838 P哥破解密码
原题传送门 考虑一个一个将字母加入字符串后面 设\(f[i][0/1/2]\)表示长度为\(i\)字符串末尾有\(0/1/2\)个A的种类数 易知: \(f[1][0]=1,f[1][1]=1,f[1 ...
- P4838 P哥破解密码
题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...
- [Luogu] P4838 P哥破解密码
题目背景 P哥是一个经常丢密码条的男孩子. 在ION 8102赛场上,P哥又弄丢了密码条,笔试满分的他当然知道这可是要扣5分作为惩罚的,于是他开始破解ION Xunil系统的密码. 题目描述 定义一个 ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- HAOI2006 (洛谷P2341)受欢迎的牛 题解
HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)
洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...
- BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...
随机推荐
- Scrum立会报告+燃尽图(十二月十一日总第四十二次):贡献分配和收集用户报告
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://git.coding.net/zhang ...
- 20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结
实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 在这里我选择的是第20号系统调用,getpid. 1.使用库函数API: 代码如下: /* getpid.c */ #incl ...
- C++的OOP特性
内存模型和名称空间 存储持续性,作用域和链接性 C++有三种方案来存储数据 自动存储持续性:在函数定义中声明的变量,包括函数参数.在函数或代码块开始执行时创建.执行完函数或者代码块,内存自动释放. 静 ...
- 什么是GPS的冷启动、温启动和热启动?
对于GPS多种启动方式的概念还很模糊,冷启动.热启动.温启动各种专业术语铺天盖地,使得许多用户眼花缭乱. 我们简单从定义上了解一下几种GPS启动的方式,GPS开机启动分为冷启动.温启动.热启动三种. ...
- PPT 遥控器
1. 下载 最新版本: 百度袋鼠输入: http://daishu.baidu.com/?from=pptweb 百度PPT遥控器:http://ppt.baidu.com/ 2. 安装过程忽略 3. ...
- [转帖] Linux 创建一个简单的私有CA、发证、吊销证书
原创帖子地址: https://blog.csdn.net/mr_rsq/article/details/71001810 Linux 创建一个简单的私有CA.发证.吊销证书 2017年04月30 ...
- [转帖] Windows 与linux的栈大小问题
一般来说,我们所用的内存有栈和堆之分,其它的我们很少控制,栈的速度快,但是空间小.不灵活:而堆的空间几乎可以满足任何要求.灵活,但是相对的速度要慢了很多,并且在VC中堆是人为控制的,new了就要del ...
- codeforces1A
Theatre Square CodeForces - 1A 一个城市的广场面积有 N×M平方米,过段时间,恰逢这个城市的庆典活动,主办方决定在广场上铺设一种新的地砖,这种地砖每块都是a×a平方米的. ...
- 【刷题】BZOJ 4945 [Noi2017]游戏
Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 字符串里的'x'看起来很烦,于是考虑枚举这些'x' ...
- THUWC2019爆零记
Day -1 现在在机房里,准备敲敲板子什么的. 今天晚上放假诶,要好好睡一下.好好睡是不可能的,这辈子不可能的. Day 0 现在在酒店,\(lwh\)神仙在超越,我打了个\(treap\)的板子就 ...