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

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

using namespace std;

const int MOD = 10000;

int fast_mod(int n)    // 求 (t^n)%MOD
{
    int t[2][2] = {1, 1, 1, 0};
    int ans[2][2] = {1, 0, 0, 1};  // 初始化为单位矩阵
    int tmp[2][2];    //自始至终都作为矩阵乘法中的中间变量 

    while(n)
    {
        if(n & 1)  //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t
        {
            for(int i = 0; i < 2; ++i)
                for(int j = 0; j < 2; ++j)
                    tmp[i][j] = ans[i][j];
            ans[0][0] = ans[1][1] = ans[0][1] = ans[1][0] = 0;  // 注意这里要都赋值成 0 

            for(int i = 0; i < 2; ++i)    //  矩阵乘法
            {
                for(int j = 0; j < 2; ++j)
                {
                    for(int k = 0; k < 2; ++k)
                        ans[i][j] = (ans[i][j] + tmp[i][k] * t[k][j]) % MOD;
                }
            }
        }

        //  下边要实现  t *= t 的操作,同样要先将t赋值给中间变量  tmp ,t清零,之后 t = tmp* tmp
        for(int i = 0; i < 2; ++i)
            for(int j = 0; j < 2; ++j)
                tmp[i][j] = t[i][j];
        t[0][0] = t[1][1] = 0;
        t[0][1] = t[1][0] = 0;
        for(int i = 0; i < 2; ++i)
        {
            for(int j = 0; j < 2; ++j)
            {
                for(int k = 0; k < 2; ++k)
                    t[i][j] = (t[i][j] + tmp[i][k] * tmp[k][j]) % MOD;
            }
        }

        n >>= 1;
    }
    return ans[0][1];
}

int main()
{
    int n;
    while(scanf("%d", &n) && n != -1)
    {
        printf("%d\n", fast_mod(n));
    }
    return 0;
}

二、斐波那契数列的衍生数列

根据斐波那契数列的矩阵法,得到此题 的结果应为s[2][2]={1,8,1,0}的n-2次幂的矩阵的s[0][0]+s[0][1]的值

#include<iostream>
const long long MOD=100000007;
using namespace std;
int main()
{
    long long n,h;
    int i,j,k;
    while(cin>>n)
    {
        long long f[2][2]={1,0,0,1};
        long long s[2][2]={1,8,1,0};
        long long t[2][2];
        if(n==1||n==2)
            cout<<1<<endl;
        else
        {
        n=n-2;
        while(n)
        {
            if(n%2!=0)
            {
                for(i=0;i<2;i++)
                    for(j=0;j<2;j++)
                        t[i][j]=f[i][j];
                for(i=0;i<2;i++)
                    for(j=0;j<2;j++)
                        f[i][j]=0;
                for(int i = 0; i < 2; ++i)
                    for(int j = 0; j < 2; ++j)
                        for(int k = 0; k < 2; ++k)
                            f[i][j] = (f[i][j]+t[i][k]*s[k][j])%MOD;
            }

            for(i=0;i<2;i++)
                    for(j=0;j<2;j++)
                        t[i][j]=s[i][j];

            for(i=0;i<2;i++)
                    for(j=0;j<2;j++)
                        s[i][j]=0;
            for(int i = 0; i < 2; ++i)
                    for(int j = 0; j < 2; ++j)
                        for(int k = 0; k < 2; ++k)
                            s[i][j] = (s[i][j]+t[i][k]*t[k][j])%MOD;
            n>>=1;
        }
        h=(f[0][0]+f[0][1])%MOD;
        cout<<h<<endl;
        }
    }
    return 0;
}
时间: 2024-12-13 23:52:55

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

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

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

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

在斐波那契数列之中 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=10000

UVA10299- Modular Fibonacci(斐波那契数列+矩阵快速幂)

题目链接 题意:给出n和m,求出f(n) % m, f(x)为斐波那契数列. 思路:因为n挺大的,如果直接利用公式计算很有可能会TLE,所以利用矩阵快速幂求解,|(1, 1), (1, 0)| * |f(n - 1), f(n - 2)| = |f(n), f(n - 1)|,所以求f(n)相当于|f(1), f(0)|乘上n - 1次的|(1, 1), (1, 0)|. 代码: #include <iostream> #include <cstdio> #include <

HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据:每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可

fibonacci数列(二)_矩阵快速幂

描述 In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … An alternative formula for the Fibonacci sequence is . Given

HDU 4549 M斐波那契数列(矩阵快速幂)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

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

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

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]