已知递推式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;
}