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

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

李陶冶 (题目提供者)

中文题目,不用多说......

点击打开链接

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define mod 1000000009

using namespace std;

long long int n;

struct node {
    long long int c[2][2];
} t;

node mult(node a,node b) {   ///矩阵相乘
    node cc;
    for(int i=0; i<2; i++) {
        for(int j=0; j<2; j++) {
            cc.c[i][j] = 0;
            for(int k=0; k<2; k++) {
                cc.c[i][j] += (a.c[i][k]*b.c[k][j])%mod;
            }
            cc.c[i][j] = cc.c[i][j]%mod;
        }
    }
    return cc;
}

node expo(long long int nn) {
    node pt = t;
    if(nn<0){
        return pt;
    }
    while(nn) {
        if(nn&1) {
            pt = mult(pt,t);
            nn--;
        }
        t = mult(t,t);
        nn = nn>>1;
    }
    return pt;
}

int main() {
    while(scanf("%lld",&n)!=EOF) {
        t.c[0][0] = 1;
        t.c[0][1] = 1;
        t.c[1][0] = 1;
        t.c[1][1] = 0;
        node tt = expo(n-2);
        printf("%lld\n",tt.c[0][0]);
    }
    return 0;
}

版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。

时间: 2024-10-27 01:05:27

51nod 1242 斐波那契数列的第N项(矩阵快速幂)的相关文章

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, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. Input输入1个数n(1 <= n <= 10^18).Output输出F(n) % 1000000009的结果.Sample Input 11 Sam

(矩阵快速幂)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, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. 输入 输入1个数n(1 <= n <= 10^18). 输出 输出F(n) % 1000000009的结果. 输入样例 11 输出样例 89解:由于斐波那

斐波那契数列以及斐波那契数列的衍生形式 利用矩阵快速幂求解

一.斐波那契数列F[n]=F[n-1]+F[n-2] 可转换为矩阵s[1,1,1,0]的n次幂的矩阵的s[0][1]的值 矩阵的幂次方 可通过 奇判断及进制移位提高时间效率 位与运算 n&1表示的意思:取二进制n的最末位,二进制的最末位为零表示n为哦数,为1表示奇数,即等价于n%2 n>>1 是将n的二进制向右移动一位, n>>=1 即把移动后的值赋给n 题目:求斐波那契数列F[n]%10000(取模) #include <cstdio> #include &l

HDOJ 4549 M斐波那契数列 费马小定理+矩阵快速幂

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 根据费马小定理  a^phi( p ) = 1 ( mod p )  这里 p 为质数 且 a 比 p小 所以 a^( p - 1 ) = 1 ( mod p ) 所以对很大的指数可以化简  a ^ k % p  == a ^ ( k %(p-1) ) % p 用矩阵快速幂求fib数后代入即可 M斐波那契数列 Time Limit: 3000/1000

1242 斐波那契数列的第N项

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 <

51Nod——T 1242 斐波那契数列的第N项

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242 基准时间限制: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)

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

用递归法计算斐波那契数列的第n项

   斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. [Fibonacci.cpp] #include<iostream>#

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <