思路:这道题的n非常大,如果直接暴力写的话肯定会超时,所以这道题要用到矩阵快速幂的知识。
对于斐波那契数列,可以用上述矩阵来求Fn的值。
#include <bits/stdc++.h>
using namespace std;
const int num = 2;
const long long mod = 1000000007;
struct mat {
long long m[num][num];
};
mat I{ //定义了一个单位矩阵。
1,0,
0,1
};
mat mul(mat a,mat b){ //矩阵的乘法 ans.m[i][j]
mat ans;
memset(ans.m,0,sizeof(ans.m));
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
for(int k=0;k<num;k++){
ans.m[i][j] = (ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
}
}
return ans;
}
mat quick_pow(mat a,long long b){ //矩阵快速幂
mat ans = I; mat tmp = a;
while(b>0){ //幂是奇数的时候
if(b&1){
ans = mul(ans,tmp);
}
tmp = mul(tmp,tmp);
b>>=1;
}
return ans;
}
int main()
{
long long n;
mat a{
1,1,
1,0
};
while(cin>>n){
mat tmp;
tmp = quick_pow(a,n);
cout<<tmp.m[0][1]<<endl;
}
return 0;
}