poj - 3070 - Fibonacci(矩阵快速幂)

本文介绍了一种利用矩阵快速幂算法高效计算大数值斐波那契数的方法,适用于n值高达10亿的情况。通过定义特定的矩阵结构,并实现矩阵乘法及快速幂运算,最终实现了对斐波那契数列的高效求解。

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

题意:求斐波那契数列第n项值(mod 10000),但n可达1,000,000,000。

题目链接:http://poj.org/problem?id=3070

——>>斐波那契数的题还可真是多,最先碰到的可在64位整数内打表过掉,接着碰到得用高精度来计算的大斐波数,到现在这道须用矩阵快速幂来计算的超大n……

#include <cstdio>

using namespace std;

const int mod = 10000;
struct Mar      //定义矩阵类型
{
    int a[2][2];
    Mar()
    {
        a[0][0] = 1;    a[0][1] = 1;
        a[1][0] = 1;    a[1][1] = 0;
    }
    Mar(int a1, int a2, int b1, int b2)
    {
        a[0][0] = a1;    a[0][1] = a2;
        a[1][0] = b1;    a[1][1] = b2;
    }
};
Mar mul(Mar e1, Mar e2)     //矩阵乘法
{
    int a1 = (e1.a[0][0]*e2.a[0][0] + e1.a[0][1]*e2.a[1][0]) % mod;
    int a2 = (e1.a[0][0]*e2.a[0][1] + e1.a[0][1]*e2.a[1][1]) % mod;
    int b1 = (e1.a[1][0]*e2.a[0][0] + e1.a[1][1]*e2.a[1][0]) % mod;
    int b2 = (e1.a[1][0]*e2.a[0][1] + e1.a[1][1]*e2.a[1][1]) % mod;
    return Mar(a1, a2, b1, b2);
}
Mar dfs(Mar cur, int x)     //求cur的x次幂
{
    if(x == 1) return cur;
    Mar temp = dfs(cur, x / 2);     //二分
    if(x % 2 == 0)
        return mul(temp, temp);
    else
        return mul(mul(temp, temp), cur);
}
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        if(n == -1) return 0;
        if(!n )printf("0\n");
        else if(n == 1) printf("1\n");
        else
        {
            Mar ret = dfs(Mar(), n-1);
            printf("%d\n", ret.a[0][0]);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值