题目:

1242 斐波那契数列的第N项

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注

斐波那契数列的定义如下:

F(0) = 0

F(1) = 1

F(n) = F(n - 1) + F(n - 2) (n >= 2)

(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, …)

给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。

Input

输入1个数n(1 <= n <= 10^18)。

Output

输出F(n) % 1000000009的结果。

Input示例

11

Output示例

89

分析:

一般我们数据小, 可以直接模拟递推过去, 这里 n 达到 10 ^ 18 很大, 时间, 空间都过不去了。

需要优化。

我们可以发现 Fn = Fn-1 + Fn-2的;

Fn = 1 1 * Fn-1

Fn-1 0 1 Fn-2

由此可构造矩阵了优化了。

实现:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const LL MOD = 1000000009;

struct Martix {
LL data[2][2]; Martix() {
for(int i = 0; i < 2; ++i)
for(int j = 0; j <2; ++j)
data[i][j] = 0;
}
Martix(int a, int b, int c, int d) {
data[0][0] = a;
data[0][1] = b;
data[1][0] = c;
data[1][1] = d;
} Martix operator * (const Martix a) const {
Martix tmp;
for(int i = 0; i < 2; ++i)
for(int j = 0; j <2; ++j)
for(int k = 0; k < 2; ++k)
tmp.data[i][j] = (tmp.data[i][j] + this->data[i][k] * a.data[k][j] % MOD) % MOD;
return tmp;
} void Print() {
cout << "Ma : \n";
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j)
cout << this->data[i][j] << " ";
cout << endl;
}
}
}; const Martix E = Martix(1,0,0,1);
const Martix Be = Martix(1,1,1,0); Martix Ma_Pow(Martix a, LL n) {
Martix ret = E;
while(n) {
if(n & 1) ret = ret * a;
a = a * a;
n >>= 1;
}
return ret;
} int main() {
LL n;
while(cin >> n) {
if (n == 0) cout << 0 <<endl;
else if (n == 1) cout << 1 << endl;
else {
Martix ans = Ma_Pow(Be, n-1);
cout << ans.data[0][0] <<endl;
}
}
}

51nod--1242 斐波那契数列第N项 (矩阵乘法优化)的更多相关文章

  1. (矩阵快速幂)51NOD 1242斐波那契数列的第N项

    斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)   (1, 1, 2, 3, 5, 8, 13, 21, ...

  2. 51nod 1242 斐波那契数列的第N项

    之前一直没敢做矩阵一类的题目 其实还好吧 推荐看一下 : http://www.cnblogs.com/SYCstudio/p/7211050.html 但是后面的斐波那契 推导不是很懂  前面讲的挺 ...

  3. 51Nod 1242 斐波那契数列的第N项(矩阵快速幂)

    #include <iostream> #include <algorithm> using namespace std; typedef long long LL; ; ; ...

  4. 51nod 1242 斐波那契数列的第N项——数学、矩阵快速幂

    普通算法肯定T了,所以怎么算呢?和矩阵有啥关系呢? 打数学符号太费时,就手写了: 所以求Fib(n)就是求矩阵  |  1  1  |n-1  第一行第一列的元素. |  1  0  | 其实学过线代 ...

  5. poj3070 求斐波那契数列第n项 ——矩阵快速幂

    题目:http://poj.org/problem?id=3070 用矩阵快速幂加速递推. 代码如下: #include<iostream> #include<cstdio> ...

  6. 1242 斐波那契数列的第N项

    1242 斐波那契数列的第N项  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F( ...

  7. 51 Nod 1242 斐波那契数列的第N项(矩阵快速幂模板题)

    1242 斐波那契数列的第N项  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...

  8. 黑马入学基础测试(三)求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

    .获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复 ...

  9. 斐波那契数列第n项的值及前n项之和

    <script>// 算法题 // 题1:斐波那契数列:1.1.2.3.5.8.13.21...// // 一.斐波那契数列第n项的值 // // 方法一//递归的写法function a ...

随机推荐

  1. python+selenium 模拟登陆,自动下单

    目前写的实在太粗糙,留着,以后来写上

  2. CentOS7 安装 Tomcat8

    安装 Java8准备更新软件yum update 如果提示没有 wget 命令,那么必须先安装 wget 如下:yum install wget 安装Tomcat8这里采用离线解压tar.gz的方式安 ...

  3. Linux系统中用户组、文件权限浅解

    用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在Linux中每个文件有所有者.所在组.其它组的概念. [所有者] 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者,用& ...

  4. IScroll基本用法

    一.为了防止手机上卡顿:1.从新设置一下焦点.2. <script>try { window.PointerEvent = undefined; } catch (e) { } </ ...

  5. 传入mybatis的xml为Long型时报There is no getter for property named 'VARCHAR' in

    修改前   <insert id="insert" parameterType="com.taotao.pojo.TbContent" >    i ...

  6. c++过程

    <<C++ beginner >> 入门 <<C++ primer>> 基础 <<The C++ programming language ...

  7. Emmet 记录

    Refs 熟悉 css 有优势,emmet 的的缩写语法特别像 css 选择器. =>参考本博笔记 # id > 直接子元素 child . class + Sibling 同级相邻的一个 ...

  8. CentOS7.2卸载完CDH5.12后重装CDH

    1因为是重装很多环境ok A mysql环境ok B 防火墙ok C hostname绑定也没有问题 D jdk也是ok E root用户,所以不涉及权限,如果不是请设置sudo权限用户    F n ...

  9. 虚拟节点操作——DocumentFragment

    文章中转站: DocumentFragment对象 createDocumentFragment()用法总结 深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

  10. zabbix系列 ~ 自动监控多实例功能

    一 场景     监控mongo的多实例端口二 目标 定制一套模板,根据不同的端口进行批量监控项的生成三 步骤  1 编写py脚本实现端口josin化输出,以便zabbix_server能进行识别  ...