P1349 广义斐波那契数列

QAQ
类似于之前的斐波那契数列,不过这次是广义的。
F(n)=p*F(n-1)+q* F(n-2)
但是数据量太大,还是使用矩阵加速,看一下这次的递推矩阵
|F(n),F(n-1)|=|F(n-1),F(n-2)|*|p,1|
             |q,0|
套路跟前面的题一样,根据递推矩阵初始化就行了

#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll ans[2][3];
ll x[3][3];
ll c[3][3];
ll m;
void ans_cf()
{
    for(int i=1;i<=1;i++)
     for(int j=1;j<=2;j++)
      c[i][j]=ans[i][j],ans[i][j]=0;
    for(int i=1;i<=1;i++)
     for(int j=1;j<=2;j++)
      for(int k=1;k<=2;k++)
       ans[i][j]=(ans[i][j]+(c[i][k]*x[k][j])%m)%m;
}
void x_cf()
{
    for(int i=1;i<=2;i++)
     for(int j=1;j<=2;j++)
      c[i][j]=x[i][j],x[i][j]=0;
    for(int i=1;i<=2;i++)
     for(int j=1;j<=2;j++)
      for(int k=1;k<=2;k++)
       x[i][j]=(x[i][j]+(c[i][k]*c[k][j])%m)%m;  
}
void fast_pow(int k)
{
    while(k)
    {
        if(k%2) ans_cf();
        x_cf();
        k/=2;
    }
}
int main()
{
    ll p,q,a1,a2,n;
    scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&m);
    if(n==1)
    {
        printf("%lld",a1%m);
        return 0;
    }
    if(n==2)
    {
        printf("%lld",a2%m);
        return 0;
    }
    x[1][1]=p,x[1][2]=1,x[2][1]=q;
    ans[1][1]=a2,ans[1][2]=a1;
    n-=2;
    fast_pow(n);
    printf("%lld",ans[1][1]%m);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值