【矩阵乘法】广义斐波那契数列

该博客介绍了如何利用矩阵快速幂的方法解决一道编程题,该题涉及广义斐波那契数列。博主分享了矩阵乘法规则,并指出需要矩阵的列数与另一矩阵的行数匹配才能相乘。通过定义矩阵结构体和重载乘法操作,博主实现了求解矩阵幂的过程。
摘要由CSDN通过智能技术生成

传送门:http://codevs.cn/problem/1574

这道题解法或许有很多吧
反正蒟蒻的我写了矩阵快速幂

第一次写矩阵乘法
先贴原理:
若两个矩阵A、B可进行矩乘,则需要A的列数和B的行数一致
若A为n行p列的矩阵,B为p行m列的矩阵
(AB)ij=pk=1AikBkj

那么回到题目中
用矩阵表示数列的通项公式

(anan1)=(p1q0)(an1an2)

由此
(anan1)=(p1q0)n2(a2a1)

那么可以使用快速幂求解矩阵的幂
PS:建议定义矩阵的结构体并重载乘法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

#define LL long long

LL p,q,x,y,n,m;
struct matrix{
    LL s[4][4];

    matrix(){
        memset(s,0,sizeof s);
    }

    matrix operator * (const matrix &n) const {
        matrix c;
        for (int i=1;i<=3;++i)
            for (int j=1;j<=3;++j)
                for (int k=1;k<=3;++k)
                    c.s[i][j]=(c.s[i][j]+s[i][k]*n.s[k][j])%m;
        return c;
    }
}
ans,k,l;

matrix pow(matrix k,LL x){
    if (x==1) return k;

    matrix u=pow(k,x>>1);
    if ((x&1)==1) return u*u*k;
    else return u*u;
}

int main(){
    scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&x,&y,&n,&m);

    k.s[1][1]=p;
    k.s[1][2]=q;
    k.s[2][1]=1;
    k.s[2][2]=0;
    l.s[1][1]=y;
    l.s[2][1]=x;
    ans=pow(k,n-2)*l;

    printf("%lld\n",ans.s[1][1]);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值