给出A,B,N,三个数,求F[N]。
已知:F[N] = A*F[N-1] + B*F[N-2]。
F[1] = 1,F[2] = 1。
根据关系式可推出如下式子:
∣∣∣f[n]f[n−1]∣∣∣=∣∣∣a1b0∣∣∣∗∣∣∣f[n−1]f[n−2]∣∣∣
|
f
[
n
]
f
[
n
−
1
]
|
=
|
a
b
1
0
|
∗
|
f
[
n
−
1
]
f
[
n
−
2
]
|
然后递推一下,套矩阵快速幂的模板就可以啦。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 7;
struct Matrix
{
ll m[5][5];
};
Matrix Mul(Matrix a,Matrix b){
Matrix res;
int n=2;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
res.m[i][j] = 0;
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
res.m[i][j] = (res.m[i][j]%mod+a.m[i][k]*b.m[k][j]%mod)%mod;
// printf("%d\n",res.m[i][j] );
}
}
}
return res;
}
void MatrixQuickPower(int n,int a,int b){
Matrix Mat,res;
Mat.m[1][1] = a;res.m[1][1] = 1;
Mat.m[1][2] = b;res.m[1][2] = 0;
Mat.m[2][1] = 1;res.m[2][1] = 0;
Mat.m[2][2] = 0;res.m[2][2] = 1;
while(n){
if(n&1) res = Mul(res,Mat);
n >>= 1;
Mat = Mul(Mat,Mat);
}
printf("%lld\n", (res.m[1][1]+res.m[1][2]+mod*mod)%mod);//注意有负数的情况
}
int main(int argc, char const *argv[])
{
int a,b,n;
while(cin>>a>>b>>n){
if(n == 1 || n == 2) puts("1");
else MatrixQuickPower(n-2,a,b);
}
return 0;
}