斐波那契数列第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) ...
随机推荐
- 交换基本数据类型的方法swap,并影响到主方法
不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下: public static void main(String[] args) { In ...
- Nhibernate学习教程(1)-- 开篇有益
NHibernate之旅(1):开篇有益 本节内容 NHibernate是什么 NHibernate的架构 NHibernate资源 欢迎加入NHibernate中文社区 作者注:2009-11-06 ...
- 1~N任意三个数最大的最小公倍数(Java版)
最大最小公倍数 如题 话不多说,直接上代码 public class MaxCommonMultiple{ public static void main(String[] args) { Scann ...
- 201521123115 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2.书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪 ...
- java程序设计-算术表达式的运算
1.团队课程设计博客链接 洪亚文博客链接:http://www.cnblogs.com/201521123065hyw/ 郑晓丽博客链接:http://www.cnblogs.com/zxl3066/ ...
- 201521123069 《Java程序设计》 第9周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. (1)使用try...catch语句捕获异常(try块后可跟一个或多个catch块,注意子类异常要放在父类异常前面, ...
- 201521123062《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- java购物车系统 团队博客
1. 团队名称.团队成员介绍(需要有照片) 团队名称:一颗LFL 团队成员:廖余俊 计算机工程学院网络工程1512 学号201521123053 方旭 计算机工程学院网络工程1512 学号201521 ...
- java课设-计算数学表达式的程序,201521123050,51 团队
1.团队名称.团队成员介绍 团队名称:天空 团队成员: 肖世松 谢庆圆 2.项目git地址 项目git地址 3.项目git提交记录截图(要体现出每个人的提交记录.提交说明) 4.项目功能架构图与主要功 ...
- 201521123104 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库,将自己的姓名.学号作为一条记录插入.(截图, ...