佳佳的 Fibonacci

题面

佳佳对数学,尤其对数列十分感兴趣。在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列。例如用 S(n) 表示 Fibonacci 前 n 项和 modm 的值,即 S(n)=(F1+F2+...+Fn)modm,其中 F1=F2=1,Fi=Fi1+Fi2。可这对佳佳来说还是小菜一碟。

终于,她找到了一个自己解决不了的问题。用 T(n)=(F1+2F2+3F3+...+nFn)modm 表示 Fibonacci 数列前 n 项变形后的和 modm 的值。

现在佳佳告诉你了一个 nm,请求出 T(n) 的值。

一句话题意

Fn 为 Fibonacci 数列,S(n)=i=1nFi,求 T(n)=i=1niFi

一句话题解

G(n)=(nF1+(n1)F2+(n2)F3+...+Fn)=i=1nS(n),则 T(n)=(n+1)×S(n)G(n)。可以发现G(n)S(n) 的前缀和,而 S(n) 又是 Fn 的前缀和,我们可以考虑在矩阵加速递推的时候一起处理出来这些值。

ans 矩阵为

[FnFn1S(n1)G(n1)]

考虑到 S(n)=S(n1)+FnG(n)=G(n1)+S(n)=G(n1)+S(n1)+Fn,可以得出 base 矩阵为

[1111100000110001]

ans=ans×baseN1,可以得到 S(n)G(n),即可代入求解。

Code

#include<bits/stdc++.h>

long long MOD_;
long long const &MOD = MOD_;

class Matrix {
public:
    typedef long long valueType;
    typedef size_t sizeType;
    typedef std::vector<valueType> Row;
    typedef std::vector<Row> Container;

public:
    sizeType row, column;
    Container data;

public:
    Matrix(sizeType _row_, sizeType _column_) : row(_row_), column(_column_), data(row + 1) {
        for (sizeType i = 1; i <= row; ++i)
            data[i].resize(column + 1, 0);
    };

    Matrix operator*(const Matrix &T) const {
        Matrix result(this->row, T.column);

        for (sizeType i = 1; i <= this->row; ++i) {
            for (sizeType k = 1; k <= this->column; ++k) {
                valueType r = this->data[i][k];

                for (sizeType j = 1; j <= T.column; ++j)
                    result.data[i][j] = (result.data[i][j] + T.data[k][j] * r) % MOD;
            }
        }

        return result;
    }

    friend std::ostream &operator<<(std::ostream &os, const Matrix &T) {
        for (sizeType i = 1; i <= T.row; ++i)
            for (sizeType j = 1; j <= T.column; ++j)
                os << T.data[i][j] << " \n"[j == T.column];

        return os;
    }

    friend std::istream &operator>>(std::istream &os, Matrix &T) {
        for (sizeType i = 1; i <= T.row; ++i)
            for (sizeType j = 1; j <= T.column; ++j)
                os >> T.data[i][j];

        return os;
    }
};

int main() {
    int N;

    std::cin >> N >> MOD_;

    Matrix ans(1, 4), base(4, 4);

    ans.data[1][1] = ans.data[1][2] = ans.data[1][3] = ans.data[1][4] = 1;
    base.data[1][1] = base.data[1][2] = base.data[1][3] = base.data[1][4] =
    base.data[2][1] = base.data[3][3] = base.data[3][4] = base.data[4][4] = 1;

    int M = N - 1;

    while (M) {
        if (M & 1) ans = ans * base;

        base = base * base;

        M = M >> 1;
    }

    long long result = (((N + 1) % MOD) * ans.data[1][3]) % MOD - ans.data[1][4];

    std::cout << (result % MOD + MOD) % MOD << std::flush;

    return 0;
}
posted @   User-Unauthorized  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示