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