hrbust 又是Fibonacci (矩阵快速幂)

本文介绍了一种利用矩阵快速幂算法高效计算斐波那契数列的方法,并给出了一段C++代码实现。该算法能有效解决斐波那契数随n增长过快的问题,通过取模操作降低计算复杂度。

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

又是Fibonacci
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 248(72 users)Total Accepted: 71(52 users)Rating: Special Judge: No
Description

斐波那契数真是神奇的数字呵。你们应该都对它很熟悉了吧?

斐波那契序列 <F[n]> 是如下定义的:

   f[0] = 0;

   f[1] = 1;

   f[n] = f[n-1]+f[n-2]; (n>1)

随着 n 的增长f[n]增长的速度非常快。

所以,每次你只要输出 f[n] 对 m 取模的结果就可以了。

Input

多组测试数据,数据的第一行是一个整数T 表示数据组数;

接下来的T 行每行两个整数 n(0<n<232), m(0<m<10000)。

Output

输出T 行,每行一个整数表示 f[n] % m 的结果。

Sample Input

2

1 10000

2 100

Sample Output

1

1

Source
2014.11.30新生赛-正式赛
#include<iostream>
#include<cstdio>
#include<string.h>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
int m;
struct mat
{
    int a[2][2];
};
mat  mat_mul(mat x,mat y)//矩阵乘法
{
    mat res;
    mem(res.a,0);
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            for(int k=0;k<2;k++){
                res.a[i][j]+=x.a[i][k]*y.a[k][j];
            }
            res.a[i][j]%=m;
        }
    }
    return res;
}
int  pow(long n)
{
    mat s1,s2;
    mem(s1.a,0);
    s2.a[0][0]=s2.a[0][1]=s2.a[1][0]=1;
    s2.a[1][1]=0;//构造矩阵
    for(int i=0;i<2;i++)
     s1.a[i][i]=1;//单位阵
     while(n)//快速幂部分
     {
         if(n&1==1){
         s1=mat_mul(s1,s2);}//更新s1
         s2=mat_mul(s2,s2);
         n>>=1;
     }
     return s1.a[0][1];//s1.a[1][0]也可以
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long n;
        scanf("%ld%d",&n,&m);
        int t=pow(n);
        printf("%d\n",t);
    }
}
矩阵快速幂一般都需要自己找递推式...初学矩阵快速幂,还没有接触。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值