zoukankan      html  css  js  c++  java
  • 洛谷——P1962 斐波那契数列

    P1962 斐波那契数列

    题目背景

    大家都知道,斐波那契数列是满足如下性质的一个数列:

    • f(1) = 1

    • f(2) = 1

    • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

    题目描述

    请你求出 f(n) mod 1000000007 的值。

    矩阵快速幂

    斐波那契数列通项公式为$f[i]=f[i-1]+f[i-2]$

    相当于DP的转移方程是一致的,那么初始矩阵 : $0 1$

    不断去乘上状态转移矩阵,即不断进行矩阵运算,最终得到目标矩阵

    如何去求状态转移矩阵呢?

    当然是根据状态转移方程来列。

    $0 1$

    $1 1$

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    
    #define N 1005
    #define ll long long
    #define mod 1000000007
    using namespace std;
    
    struct Martixt {
        ll n,m,a[N][N];
    } A,B,C;
    
    ll n;
    
    void mul_1() {
        for(int i=1; i<=2; i++)
            for(int j=1; j<=2; j++)
                B.a[i][j]=A.a[i][j],A.a[i][j]=0;
        for(int i=1; i<=2; i++)
            for(int j=1; j<=2; j++)
                for(int k=1; k<=2; k++)
                    A.a[i][j]=(A.a[i][j]+B.a[i][k]*B.a[k][j]%mod)%mod;
    }
    
    void mul_2() {
        for(int j=1; j<=2; j++)
            B.a[1][j]=C.a[1][j],C.a[1][j]=0;
    
        for(int j=1; j<=2; j++)
            for(int k=1; k<=2; k++)
                C.a[1][j]=(C.a[1][j]+B.a[1][k]*A.a[k][j]%mod)%mod;
    }
    
    void matrix_pow() {
        for(; n; n>>=1,mul_1())
            if(n&1) mul_2();
    }
    int main() {
        scanf("%lld",&n);
        A.a[1][1]=0;
        A.a[1][2]=A.a[2][1]=A.a[2][2]=1;
        C.a[1][1]=0;
        C.a[1][2]=1;
        matrix_pow();
    
        printf("%d",C.a[1][1]);
    
        return 0;
    }
  • 相关阅读:
    bzoj 1821: [JSOI2010]Group 部落划分 Group
    codevs 1217 借教室
    洛谷 P2678 跳石头
    洛谷 P1316 丢瓶盖
    洛谷 P2683 小岛
    洛谷 P2431 正妹吃月饼
    loj #6092. 「Codeforces Round #418」恋爱循环
    loj #6091. 「Codeforces Round #418」幻想特快
    loj #6090. 「Codeforces Round #418」尘封思绪
    前端移植说明
  • 原文地址:https://www.cnblogs.com/song-/p/9736765.html
Copyright © 2011-2022 走看看