斐波那契数列第N项f(N)[矩阵快速幂]
矩阵快速幂
定义矩阵A(m*n),B(p*q),A*B有意义当且仅当n=p。即A的列数等于B的行数。
且C=A*B,C(m*q)。
例如:
进入正题,由于现在全国卷高考不考矩阵,也没多大了解。因为遇到了斐波那契这题...
注意到: Fn+1=Fn+Fn-1
我们会有:
则:
所以我们只需要想办法求矩阵A的幂,这时候我们当然想要用快速幂。
代码部分:
定义矩阵:
struct matrix{ ll a[][]; };
(类比整数的快速幂)预处理:
[我们需要一类似于1的矩阵:]
『1 0 0
0 1 0
0 0 1』类似这种操作...
void init(){ int i,j; memset(res.a,,sizeof res.a); ;i<=;i++) res.a[i][i]=; ][]=; ][]=; ][]=; ][]=;}
矩阵乘法:[就该题而言]
matrix mul(matrix p,matrix q){ int i,j,k; matrix m; memset(m.a,,sizeof m.a); ;i<=;i++) ;j<=;j++) ;k<=;k++) m.a[i][j]=(m.a[i][j]+p.a[i][k]*q.a[k][j])%Mod; return m; }
快速幂:
void mfpow(ll p){ init(); while(p){ ) res=mul(base,res); base=mul(base,base); p>>=; } }
全部的代码:(lowbee的难免会差一些,请大佬们见谅...)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll ; inline ll read(); ; struct matrix{ ll a[][]; }; matrix res,base; ll ans; ll c[]; ll n; namespace lys{ void init(){ int i,j; memset(res.a,,sizeof res.a); ;i<=;i++) res.a[i][i]=; ][]=; ][]=; ][]=; ][]=; } matrix mul(matrix p,matrix q){ int i,j,k; matrix m; memset(m.a,,sizeof m.a); ;i<=;i++) ;j<=;j++) ;k<=;k++) m.a[i][j]=(m.a[i][j]+p.a[i][k]*q.a[k][j])%Mod; return m; } void mfpow(ll p){ init(); while(p){ ) res=mul(base,res); base=mul(base,base); p>>=; } } int main(){ int k; n=read(); mfpow(n-); c[]=; c[]=; ;k<=;k++) ans=(ans+res.a[][k]*c[k])%Mod; cout<<ans<<endl; ; } } int main(){ lys::main(); ; } inline ll read(){ ll k=,f=; char c=getchar(); '){ if(c=='-') f=-; c=getchar(); } '){ k=k*+c-'; c=getchar(); } return k*f; }
题目链接[luogu]:
https://www.luogu.org/problem/show?pid=1962
斐波那契数列第N项f(N)[矩阵快速幂]的更多相关文章
- HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Li ...
- 黑马入学基础测试(三)求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
.获得用户的输入 计算 3打印就行了. 这里用到了java.util.Scanner 具体API 我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复 ...
- 斐波那契数列第n项的值及前n项之和
<script>// 算法题 // 题1:斐波那契数列:1.1.2.3.5.8.13.21...// // 一.斐波那契数列第n项的值 // // 方法一//递归的写法function a ...
- python练习题-打印斐波拉契数列前n项
打印斐波拉契数列前n项 #encoding=utf-8 def fibs(num): result =[0,1] for i in range(num-2): result. ...
- 经典算法详解(1)斐波那契数列的n项
斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...
- 用JS,求斐波那契数列第n项的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 00.斐波那契数列第n项
# 斐波那契数列第n项 # 1 1 2 3 5 8 def fib(n): if n <= 2: return 1 else: return fib(n-2)+fib(n-1) def fib2 ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)
题目: 1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...
随机推荐
- URI和URL的区别 一起学习呗
一直存在很多技术上的争论,其中最为妙的恐怕就是web地址应该叫什么的问题.通常情况就是这样:有人把地址栏的内容叫"URL",这时候有些人就来劲了:"不!其实那就是URI. ...
- < 软件工程 第一次作业 >
自我介绍: 老师好! 我叫李智强,专业是计算机科学与技术,我自己也喜欢这个专业,然后这是我第一次用博客写自我介绍,可能会写的有点不好,还请包涵. 课程期望和目标: 第一次上课,听着老师说我们可能会做很 ...
- 交换基本数据类型的方法swap,并影响到主方法
不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下: public static void main(String[] args) { In ...
- 二:搭建一个webpack3.5.5项目:建立项目的webpack配置文件
第一步: npm init -y [初始文件] npm info webpack / bower info webpack[查看版本,用bower的时候要先 npm install bower] np ...
- Android 日夜间切换Demo
这是其中一种实现模式,也是比较麻烦的一种,首先写布局,不多说上代码 activity_main.xml <?xml version="1.0" encoding=" ...
- Linux Centos 6.9中SSH默认端口修改的坑
关于Linux Centos6.5的SSH默认端口修改的博客有一大堆,我在这里就不啰嗦了,但是面对Centos 6.9,就会发现有一个巨坑: 修改iptables之后执行下面的命令后: # servi ...
- Swing-setBorder()用法-入门
注:本文内容转自:Swing编程边框(Border)的用法总结.内容根据笔者理解稍有整理. 函数说明: public void setBorder(Border border) 设置此组件的边框.Bo ...
- 201521123076 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- evak购物车-课程设计(201521123034陈凯欣)
1.团队课程设计博客链接 https://i.cnblogs.com/EditPosts.aspx?postid=7047127 2.个人负责模块或任务说明 1.Java 编写商品类Goods,商品属 ...
- 201521123075 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...