[板子]矩阵快速幂求解斐波那契

在斐波那契数列之中

f[i] = 1*f[i-1]+1*f[i-2]  f[i-1] = 1*f[i-1] + 0*f[i-2];

所以

就这两幅图完美诠释了斐波那契数列如何用矩阵来实现。

摘自:http://blog.csdn.net/nyist_tc_lyq/article/details/52981353

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const long long pi=1000000007;
struct node{
    long long a[3][3];
}t1;

long long n,k;
node X(node x,node y){
      node box;

    for(LL i=1;i<=2;i++){
        for(LL j=1;j<=2;j++){
            box.a[i][j]=0;
        }
    }

    for(LL i=1;i<=2;i++){

        for(LL j=1;j<=2;j++){

            for(LL k=1;k<=2;k++){

                box.a[i][j]=(box.a[i][j]+(x.a[i][k]*y.a[k][j])%pi)%pi;

            }
        }
    }

    return box;
}
void power(long long kk){
    node ans;
    kk-2;
    ans.a[1][1]=1;ans.a[1][2]=1;
    ans.a[2][1]=1;ans.a[2][2]=0;

    while(kk!=0){
        if(kk&1==1){
            ans=X(ans,t1);
        }
        kk>>=1;
        t1=X(t1,t1);

    }
    cout<<ans.a[2][2]<<endl;
}
int main(){
    cin>>n;
    if(n==0)
        cout<<"0"<<endl;
    else if(n==1||n==2)
        cout<<"1"<<endl;
    else{
        t1.a[1][1]=1;t1.a[1][2]=1;
        t1.a[2][1]=1;t1.a[2][2]=0;

        power(n);
    }
    return 0;
}
时间: 2024-10-07 23:47:03

[板子]矩阵快速幂求解斐波那契的相关文章

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

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

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

矩阵快速幂求斐波那契

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int p=10000; 4 typedef long long ll; 5 int n,m; 6 7 struct node { 8 ll a[2][2]; 9 10 node operator*(const node &b) const { 11 node res; 12 for (int i = 0; i < 2; i++) { 13 for (int j =

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

#斐波那契数列用矩阵快速幂求解f(n)#

通常情况下,斐波那契数列第n项可以通过递归求解或者直接求解但当n非常大的时候,求解f(n)将显得非常困难下面利用矩阵以及快速幂的方法在logn复杂度内求解 则可以运用快速幂来求解矩阵高次幂,复杂度降为logn 来自为知笔记(Wiz)

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

一.斐波那契数列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

矩阵乘法(四):分析问题,确定递推式,采用矩阵快速幂求解

应用矩阵快速幂运算可以解决递推问题.在实际应用中,有时候题目并没有直接给出递推式,需要认真分析问题,找出递推式,然后再利用矩阵快速幂运算加快问题的求解. [例1]程序阅读理解. 有如下的C语言程序: #include <stdio.h>int main(){     int n,m,f,i;     while(scanf("%d%d",&n,&m)!=EOF)     {           f=0;           for(i=1;i<=n;i

求解斐波那契数列的第n项

对于Fibonacci数列,1,1,2,3,5,8,12,...求解第n项值,我们通常用的是递归算法,即递推式f(n) = f(n-1)+f(n-2).然而这其实是一种效率极低的算法,当n达到41时,就已经需要1s左右,随着n的增加,时间是指数级增长的. 因为该递归算法有太多的重复计算,如下图所示,所用时间T(n) = T(n-1)+T(n-2)+Θ(1),可以知道T(n)有Ω((3/2)n)的下界,T(n)<O(2^n),可以看到这是指数级的时间复杂度. 具体代码实现如下: Elemtype

【编程小题目1】求解斐波拉契数列问题

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”.Fibonacci 数列定义:n = 1,2 时,fib(n) = 1n > 2 时,fib(n) = fib(n-2) + fib(n-1) // 递归算法求解Fibonacci 数列 #i