简单的斐波那契

广义斐波那契

与原来的斐波那契类似

递推的公式有所变化

如果直接线性递推,O(n)的复杂度,在很多题目中都会被卡,所以这时候就可以用矩阵吗快速幂复杂度是O(logn)的

比照普通的快速幂,矩阵快速幂就是一样的思路

ll quick_pow(ll a,ll b,ll p)
{
   ll ans=1;
   while (b)
   {
     if (b&1)  ///b为奇数
        ans=(ans*a)%p;
     a=(a*a)%p; ///b为偶数
     b>>=1;
   }
   return ans;
}

乘以

就可以得到

所以只要把

乘以的n-1次方就可以得到FN Fn+1,而矩阵快速幂就可以快速求出后面的矩阵的n-1次方


模板题

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
ll n,k;
struct Node {
   ll a[101][101];
}ret,tmp;
Node chen(Node x,Node y)
{
    Node D;
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)D.a[i][j]=0;
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)
            for (int k=1;k<=2;++k)
                D.a[i][j]=(D.a[i][j]%mod+(x.a[i][k]*y.a[k][j])%mod)%mod;///基本的矩阵乘法
                return D;

}
Node quick_chen(ll b,Node z)
{
    Node s=tmp;///首先要开个单位矩阵,保证开始的乘法不变
    while (b)
    {
       if (b&1)  s=chen(s,z);///b为奇数,更新s
       z=chen(z,z);
       b>>=1;
    }
    return s;
}

int main()
{
    ll n;
    scanf("%lld",&n);
    tmp.a[1][1]=1ll;
    tmp.a[2][2]=1ll;///2*2的单位矩阵
    Node Z;
    Z.a[1][2]=1ll;
    Z.a[2][1]=1ll;
    Z.a[2][2]=1ll;///初始化
    Node Q=quick_chen(n-1,Z);///1 1
    printf("%lld\n",((Q.a[1][1]+Q.a[2][1])%mod*1ll*(Q.a[1][2]+Q.a[2][2])%mod)%mod);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll mod=1e9+7;
struct Node {
  long long  a[10][10];
    Node(){
        for (int i=1;i<=2;++i)
          for(int j=1;j<=2;++j)
             if(i==j) a[i][j]=1ll;
             else a[i][j]=0;
        }
}tmp;
Node chen(Node x,Node y)
{
    Node D;
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)D.a[i][j]=0;
    for (int i=1;i<=2;++i)
        for (int j=1;j<=2;++j)
            for (int k=1;k<=2;++k)
                D.a[i][j]=(D.a[i][j]%mod+(x.a[i][k]%mod*y.a[k][j]%mod)%mod)%mod;
                return D;

}
Node quick_chen(long long b,Node z)
{
    Node s=tmp;
    while (b)
    {
       if (b&1)  s=chen(s,z);
       z=chen(z,z);
       b>>=1;
    }
    return s;
}
int main()
{
    ll b,c,p,q,n,m;
    scanf("%lld%lld%lld%lld%lld%lld",&b,&c,&p,&q,&n,&m);///an=b*an-1+c*an-2  p=an-1 q=an-2  m=mod
    mod=m;
    Node Z;
    Z.a[1][1]=0;
    Z.a[1][2]=c%mod;
    Z.a[2][1]=1ll;
    Z.a[2][2]=b%mod;
    Node Q=quick_chen(n-1,Z);///1 1
    printf("%lld\n",(Q.a[1][1]*p%mod+Q.a[2][1]*q%mod)%mod);
    return 0;
}

当然按照之前的想法,斐波那契有着递推公式

给一个简单的证明

带根号也许不好处理,但是遇到取模的操作也就可以用上根号,譬如根号5,用二次剩余

令N=5,也就是x=根号5 求解出的x取模和原本的根号5取模等价,就直接先求出2的逆元,然后拆分成1和根号5按照之前的步骤二次剩余根号5也就是(1+根号5等价的数)*2的逆元%p

但是局限性很大,mod 1e9+9二次剩余还有解,但是1e9+7就不存在根号5的二次剩余了,权当一种思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Video Player All Format是一种专业的视频播放工具。它支持所有视频格式,4K /超高清视频文件,并可以高清播放。它是适用于android平板电脑和android手机的最佳高清视频播放器之一。视频播放器所有格式还可以保护您的私人视频在人们使用您的设备时不被删除或观看。 主要特点: ●支持所有视频格式,包括MKV,MP4,M4V,AVI,MOV,3GP,FLV,WMV,RMVB,TS等。 ●超高清视频播放器,支持4K。 ●硬件加速。 ●使用私人文件夹保护您的视频安全。 ●使用Chromecast将视频投射到电视上。 ●支持字幕下载器等。 ●调整字幕和音频。 ●夜间模式,快速静音和播放速度。 ●自动识别设备和SD卡上的所有视频文件。 ●轻松管理或共享视频。 ●易于控制音量,亮度和播放进度。 ●多种播放选项:自动旋转,宽高比,屏幕锁定等。 ●适用于android平板电脑和android手机的视频播放器hd。 全格式视频播放器 播放所有格式的视频,包括MKV,MP4,M4V,AVI,MOV,3GP,FLV,WMV,RMVB,TS等。 高清视频播放器可 流畅播放高清,全高清和4k视频,还可以慢动作播放视频。 适用于android平板电脑的视频播放器 支持所有设备,同时在android平板电脑和android手机上观看视频。 视频播放器,可投射到 Chromecast的电视视频播放器。使用Chromecast轻松将视频投射到Android TV。这是适用于android的最佳chromecast应用。 易于使用 通过在播放屏幕上滑动,易于控制音量,亮度和播放进度。 文件管理器自动 识别设备和SD卡上的所有视频文件。此外,轻松管理或共享视频。 XPlayer所有格式的视频播放器是一款完全免费的Android高清视频播放器,简单而强大。支持任何视频格式。多合一媒体播放器,适用于不同格式。我们欢迎任何建议,以改善用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值