博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YYHS-Floor it(递推+矩阵乘法+快速幂)
阅读量:6329 次
发布时间:2019-06-22

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

题目描述

输入

输出

样例输入

5 97

样例输出

11

提示

 
 
 

 

题解

先不管p,通过列举前面几项,不难发现当i为偶数时,a[i]=a[i-1]+a[i-2],当i为奇数时,a[i]=a[i-1]+a[i-2]+1,具体证明还不会,希望有大佬能在讨论区讲讲

知道了a[i]的通项后,我们可以通过矩阵乘法的快速幂log(n)来求出答案。

具体怎么做,我们可以两项两项的来做,最后再判断一下n的奇偶性就可以了。

不过我是用3维矩阵来做的

刚开始的ans为
0 0 0
0 0 0
1 2 1
ans[3][1]表示a[i-1],ans[3][2]表示a[i]  
tmp为
1 1 0
1 2 0
1 1 1
刚开始Matrix_pow(n/2-1,p),具体为什么是这样可以代一个n=2进去,这样Matrix_pow不会做,再判断n为偶数,那么答案就是ans[3][2],发现是正确的
 
做完Matrix_pow后,判断n为奇数就再乘一个矩阵temp为
0 1 0
1 1 0
0 1 1
最后答案就是ans[3][2]
不过这里你要特判一下n=0和n=1的情况,我就是被n=0给坑了,害得我找了1个小时的错
1 #include
2 #define ll long long 3 using namespace std; 4 ll n,p; 5 ll tmp[4][4],temp[4][4],ans[4][4],c[4][4]; 6 void Matrix_mul(ll a[4][4],ll b[4][4]){ 7 for (int i=1;i<=3;i++) 8 for (int j=1;j<=3;j++){ 9 c[i][j]=0;10 for (int k=1;k<=3;k++)11 c[i][j]=(c[i][j]+a[i][k]%p*b[k][j]%p)%p;12 }13 }14 void Matrix_pow(ll n){15 while (n>0){16 if (n%2){17 Matrix_mul(ans,tmp);18 memcpy(ans,c,sizeof(ans));19 }20 Matrix_mul(tmp,tmp); 21 memcpy(tmp,c,sizeof(tmp));22 n>>=1;23 }24 }25 int main(){26 scanf("%lld%lld",&n,&p);27 if (!n||n==1){ printf("%lld\n",1%p); return 0; }28 tmp[1][1]=1; tmp[1][2]=1; tmp[2][1]=1; tmp[2][2]=2; tmp[3][1]=1; tmp[3][2]=1; tmp[3][3]=1;29 ans[3][1]=1; ans[3][2]=2; ans[3][3]=1;30 temp[1][2]=1; temp[2][1]=1; temp[2][2]=1; temp[3][2]=1; temp[3][3]=1;31 Matrix_pow(n/2-1);32 if (n%2){33 Matrix_mul(ans,temp);34 memcpy(ans,c,sizeof(ans));35 }36 printf("%lld\n",ans[3][2]);37 return 0;38 }
View Code

 

转载于:https://www.cnblogs.com/zhuchenrui/p/7554064.html

你可能感兴趣的文章
如何成为一个设计师和程序员混合型人才
查看>>
unable to load selinux policy. machine is in enforcing
查看>>
2015年10月23日作业
查看>>
MySQL5.7 加强了root用户登录安全性
查看>>
CentOS 6.3_Nagios安装配置与登录
查看>>
加强型的记录集权限(数据集权限、约束表达式设置功能)实现方法界面参考...
查看>>
Linux 内存机制
查看>>
linux下定时任务
查看>>
SharePoint 2013 部署 Part 1
查看>>
DWGSee看图纸dwg文件阅读器免费下载地址
查看>>
高能天气——团队Scrum冲刺阶段-Day 1-领航
查看>>
ISI CVPR journal ranking
查看>>
free movie
查看>>
列表组
查看>>
CF 988E Divisibility by 25 思维 第十二
查看>>
Linux Shell多命令执行
查看>>
Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
查看>>
css3中的变形(transform)、过渡(transtion)、动画(animation)
查看>>
tomcat生产环境JDK部署及虚拟主机等常用配置详解
查看>>
web服务器tomcat入门实战
查看>>