POJ3070矩阵快速幂简单题
题意:
求斐波那契后四位,n <= 1,000,000,000.
思路:
简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键是能把问题转换成矩阵的题目,也就是转换成简单加减地推式,下面说下怎么样根据递推式构造矩阵把,这个不难,我的习惯是在中间插矩阵,就是比如斐波那契
a[n] = a[n-1] + a[n-2];
我的习惯是这样,首先要知道这个式子是有连续的两个项就可以推出第三个项
那么
a1 a2 0 1 a2 a3 这样就直接出来了中间矩阵,然后快速幂处理,这个是
1 1 最简单的了,一般都是要想办法各种转换,然后在构造式子
然后在快速幂,还有注意,矩阵可以把最下面那个循环拿到上面
然后通过if(mat[i][k])来优化,我下面的用了,这个要看0出现 的多不多(比较重要),还有可以通过调换循环位置(这个是底 层优化,不在算法范围之内)优化,推荐一个好题,杭电上有个 叫 什么什么233的那个,记得当时做那个题做的比较爽。
#include<stdio.h>
#include<string.h>
#define MOD 10000
typedef struct
{
int mat[3][3];
}M;
M matM(M a ,M b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int k = 1 ;k <= 2 ;k ++)
for(int i = 1 ;i <= 2 ;i ++)
if(a.mat[i][k])
for(int j = 1 ;j <= 2 ;j ++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
return c;
}
M qPowMat(M a ,int b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int i = 1 ;i <= 2 ;i ++)
c.mat[i][i] = 1;
while(b)
{
if(b&1) c = matM(c ,a);
a = matM(a ,a);
b >>= 1;
}
return c;
}
int main ()
{
int n ,i;
M star ,ans;
star.mat[1][1] = 0;
star.mat[1][2] = star.mat[2][1] = star.mat[2][2] = 1;
while(~scanf("%d" ,&n) && n != -1)
{
if(n == 0)
{
printf("0\n");
continue;
}
if(n == 1)
{
printf("1\n");
continue;
}
ans = qPowMat(star ,n);
printf("%d\n" ,(0 * ans.mat[1][1] + 1 * ans.mat[2][1]) % MOD);
}
return 0;
}
POJ3070矩阵快速幂简单题的更多相关文章
- luoguP3390(矩阵快速幂模板题)
链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...
- POJ3070 斐波那契数列递推 矩阵快速幂模板题
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...
- 解题报告:poj 3070 - 矩阵快速幂简单应用
2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...
- HDU 1575 矩阵快速幂裸题
题意:中文题 我就不说了吧,... 思路:矩阵快速幂 // by SiriusRen #include <cstdio> #include <cstring> using na ...
- POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10521 Accepted: 7477 Descri ...
- Final Destination II -- 矩阵快速幂模板题
求f[n]=f[n-1]+f[n-2]+f[n-3] 我们知道 f[n] f[n-1] f[n-2] f[n-1] f[n-2] f[n-3] 1 1 ...
- hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)
Problem DescriptionA为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据.每组数据的第一行有 ...
- poj3070矩阵快速幂求斐波那契数列
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13172 Accepted: 9368 Desc ...
- POJ3070 矩阵快速幂模板
题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...
随机推荐
- Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 通达OA 越权访问-2013/2015版本
漏洞参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/9.html 复现 根据⽹上的通达 OA的源码找这些敏感地址,如: /general/syst ...
- CMU数据库(15-445)Lab3- QUERY EXECUTION
Lab3 - QUERY EXECUTION 实验三是添加对在数据库系统中执行查询的支持.您将实现负责获取查询计划节点并执行它们的executor.您将创建执行下列操作的executor Access ...
- 最新版Swagger 3升级指南和新功能体验!
Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...
- [^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问>
[^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问> 这道题目说穿了, 就是要探讨 Wildcard(通配符)与 Regular Expression(正则表达式)的差别的. ...
- 使用SignalR ASP.NET Core来简单实现一个后台实时推送数据给Echarts展示图表的功能
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功能添加到应用程序的功能. 实时 web 功能使服务器端代码可以立 ...
- 01-MySQL Linux安装
一.检查当前系统是否安装过mysql rpm -qa|grep mysql 或 ps -ef|grep mysql 二.安装mysql服务端 rpm -ivh MySQL-server-5.5.48- ...
- BUAA_2020_OO_UNIT2_REVIEW
OO第二单元总结 1. 设计策略 总的来说,三次作业没有大的重构,都是使用了多线程进行电梯调度,输入线程和运行线程分离,主要的不同在于三次电梯调度器线程的数量有所不同,第一次为一个,第二次为n个,第三 ...
- Git版本控制之-创建配置本地git仓库
查看全局配置:code .gitconfig [code 就代表的用vscode 打开gitconfig 文件,如果是 sublime 就是 subl ][如果打开失败说明环境变量没有配置] [只有配 ...
- [shell脚本]在Linux终端可视化输出表格数据
最终效果 1. 自定义表格样式 2. 自定义主题颜色 支持三系普通颜色 支持16色彩虹色 支持单颜色 回顾一下shell语法 1. shell传递参数 我们可以在执行shell脚本时实时传递参数从而指 ...