已知递推式F(n)=a*F(n-1)+b*F(n-2),给定a,b,F(0),F(1)的值以及n,求F(n)。
既然初始的f1,f2是随机的所以,先构造这俩个初始的矩阵.
A:
f2 0 0
f1 0 0
1 0 0
a b c //这里没有常熟项所以c值为0
1 0 0
0 0 1
这样就构造出了已知的两个初始的矩阵然后就是用系数的矩阵B与单位矩阵连乘n-1次,得到的结果再和初始化的矩阵
相乘_(注意向后顺序问题).
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000000007
#define LL long long
using namespace std;
struct node
{
LL Map[4][4];
};
LL a,b,c,d,f1,f2,n;
node mul(node a,node b)
{
node tmp;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
tmp.Map[i][j]=0;
for(int k=0;k<3;k++)
{
tmp.Map[i][j]+=a.Map[i][k]*b.Map[k][j];
tmp.Map[i][j]%=mod;
}
}
return tmp;
}
node qp(node a,LL n)
{
node tmp={1,0,0,0,1,0,0,0,1};
while(n)
{
if(n&1)
tmp=mul(tmp,a);
a=mul(a,a);
n=n>>1;
}
return tmp;
}
int main()
{
while(~scanf("%lld%lld%lld%lld%lld",&a,&b,&f1,&f2,&n))
{
node arr,arr2;
memset(arr.Map,0,sizeof(arr.Map));
memset(arr2.Map,0,sizeof(arr2.Map));
arr.Map[0][0]=f2;arr.Map[1][0]=f1;arr.Map[2][0]=1;
arr2.Map[0][0]=a;arr2.Map[0][1]=b;
arr2.Map[1][0]=arr2.Map[2][2]=1;
node p=qp(arr2,n-1);
p=mul(p,arr);
printf("%lld\n",p.Map[0][0]);
}
return 0;
}
递推式矩阵快速幂求解

本文介绍了一种利用矩阵快速幂的方法来高效解决特定形式的递推问题。通过构造特定矩阵并运用快速幂算法,可以大幅减少计算复杂度,实现对递推式F(n)=a*F(n-1)+b*F(n-2)的快速求解。
1341

被折叠的 条评论
为什么被折叠?



