CodeForces405B - Jzzhu and Sequences 矩阵快速幂

本文介绍了一种使用矩阵快速幂算法高效计算斐波那契数列的方法。通过构建特定矩阵并利用快速幂运算,可以显著提高计算效率,尤其是在处理大数值时。文章提供了详细的代码实现,包括矩阵乘法、矩阵快速幂等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

就是说:

f1 = x;      f2 = y;  然后 f(i) = f(i-1) + f(i+1)

化简一下式子:

f(i+1) = f(i) - f(i-1)

用i 替换 i+1, 则

f(i) = f(i-1) - f(i-2)  这样就差不多可斐波那契的矩阵快速幂了 构造一个矩阵

\begin{pmatrix} f1 & f2 \end{pmatrix}\begin{pmatrix} 0 & -1 \\ 1 & 1 \end{pmatrix}=\begin{pmatrix} f2 & \quad f2-f1=f3 \end{pmatrix}

就是很裸的矩阵快速幂了 

注意取膜啊阿啊阿啊阿啊

#include <stdio.h>
typedef long long LL;
long long read(){
    long long x = 0, f = 1;
    char ch=getchar();
    while(ch < '0' || ch > '9'){if(ch=='-') f = -1; ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
const int maxn = 2;
const int mod = 1e9 + 7;
struct Matrix{
    long long int m[maxn][maxn];
}unit;
Matrix operator * (Matrix a, Matrix b){
    Matrix ret;
    LL x;
    int n = 2;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            x = 0;
            for(int k = 0; k < n; ++k){
                x += (((LL)a.m[i][k] * b.m[k][j]) + mod ) % mod;
            }
            ret.m[i][j] = (x + mod) % mod;
        }
    }
    return ret;
}
void init_unit(){
    // 单位矩阵
    for(int i = 0; i < maxn; ++i){
        unit.m[i][i] = 1;
    }
}
Matrix pow_mat(Matrix a, LL n){
    Matrix ans = unit;
    while (n) {
        if(n & 1){
            ans = ans * a;
        }
        a = a * a;
        n >>= 1;
    }
    return ans;
}
int main(){
    init_unit();
    Matrix ans, a;
    ans.m[0][0] = read();
    ans.m[0][1] = read();
    
    a.m[0][0] = 0; a.m[0][1] = -1;
    a.m[1][0] = 1; a.m[1][1] = 1;
    
    long long int n = read();
    a = pow_mat(a, n - 1);
    ans = ans * a;
    printf("%lld\n", (ans.m[0][0] + mod )% mod);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值