蓝桥集训之斐波那契数列

蓝桥集训之斐波那契数列

  • 核心思想:矩阵乘法

    • 将原本O(n)的递推算法优化为O(log2n)

    • 在这里插入图片描述

    • 构造1x2矩阵f和2x2矩阵a

    • 发现f(n+1) = f(n) * a

      • 则f(n+1) = f(1) * an
      • 可以用快速幂优化
  •   #include <iostream>
      #include <cstring>
      #include <algorithm>
      
      using namespace std;
      const int MOD = 10000;
      int f[2];
      int a[2][2];
      int n;
      
      void mul1()
      {
          int res[2];  //res = res*a 求1x2矩阵
          memset(res,0,sizeof res);
          for(int i=0;i<2;i++)
              for(int j=0;j<2;j++)
                  res[i] = (res[i] + f[j] * a[j][i]) %MOD;  //计算f*a
                  
          memcpy(f,res,sizeof f);
      }
      void mul2()
      {
          int res[2][2];  //a = a*a 求2x2矩阵
          memset(res,0,sizeof res);
          for(int i=0;i<2;i++)
              for(int j=0;j<2;j++)
                  for(int k=0;k<2;k++)
                      res[i][j] = (res[i][j] + a[i][k] * a[k][j])%MOD;  //计算a*a
          
          memcpy(a,res,sizeof a);
      }
      void qmi(int n)
      {
          while (n)  //快速幂优化
          { 
              if(n&1) mul1();  //res = res*a%MOD
              mul2();  //a = a*a%MOD
              n>>=1;
          }
      }
      int main()
      {
          while(cin>>n , n!=-1)
          {
              f[0] = 0,f[1] = 1;  //初始化第0 1项
              a[0][0] = 0,a[0][1] = 1,a[1][0] = 1,a[1][1] = 1;  //初始化a矩阵
              qmi(n); 
              cout<<f[0]<<endl;
          }
          return 0;
      }
    
  • 45
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值