斐波那契数列加强版(矩阵快速幂)(TJU 保研上机)

斐波那契数列加强版
image

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int MOD = 1e9 + 7;

ll n;
// 2x2矩阵定义
struct Matrix{
    ll m[2][2];
    Matrix(){
        m[0][0] = m[0][1] = m[1][0] = m[1][1] = 0;
    }
    Matrix operator * (const Matrix& a)const{
        Matrix res;
        for(int i = 0; i < 2; ++i){
            for(int k = 0; k < 2; ++k){
                for(int j = 0; j < 2; ++j){
                    res.m[i][j] += (m[i][k] * a.m[k][j]) % MOD;
                }
            }
        }
        return res;
    }
};

// 快速幂
Matrix qpow(Matrix base, ll exp){
    Matrix res;
    res.m[0][0] = res.m[1][1] = 1;
    while(exp){
        if(exp & 1) res = res * base;
        base = base * base;
        exp >>= 1;
    }
    return res;
}

signed main() {
    cin >> n;
    if(n <= 2){
        if(n == 0) cout << "0\n";
        else cout << "1\n";
        return 0;
    }
    Matrix base;
    base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
    base.m[1][1] = 0;

    Matrix res = qpow(base, n - 2);

    // f(n) = res[0][0]*f(2) + res[0][1]*f(1)
    ll fn = (res.m[0][0] + res.m[0][1]) % MOD;
    cout << fn << "\n";

    return 0;
}
posted @ 2025-07-31 00:28  awei040519  阅读(12)  评论(0)    收藏  举报