Fn=1 (n≤2),Fn = Fn−1+Fn−2 (n≥3),求给出一个n,求Fn?
分析:显然当n非常大时,使用递推的方法复杂度太高。此时需要考虑快速幂提高速度,以及矩阵乘法进行优化
ans矩阵用来存放答案,首先应给ans初始化成单位矩阵,即主对角线的值赋值成1。
base矩阵用来存放幂,但应初始化为系数矩阵,本例中为 1 1
1 0
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#define ll long long
const int mod = 1e9+7;
using namespace std;
struct Node
{
ll s[10][10];
}ans,base;
Node mul(Node x,Node y)
{
Node temp;
memset(temp.s,0,sizeof(temp.s));
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)
{
temp.s[i][j] += (x.s[i][k]%mod)*(y.s[k][j]%mod);
temp.s[i][j] %= mod;
}
}
}
return temp;
}
Node ksm(ll n)
{
while(n)
{
if(n&1) ans = mul(ans,base);
base = mul(base,base);
n>>=1;
}
}
int main()
{
memset(ans.s,0,sizeof(ans.s));
memset(base.s,0,sizeof(base.s));
base.s[1][1] = base.s[1][2] =base.s[2][1] = 1;
ans.s[1][1] = ans.s[2][2] = 1;
ll n;
cin>>n;
if(n<3)
{
cout<<1;
return 0;
}
ksm(n);
cout<<ans.s[2][1];
return 0;
}