题目链接:点击打开链接
题意:中文题意不解释了。
题解:n的大小为 10的18次方,用递推方程 F【n】 = F【n-1】 + F【n-2】时间绝对会超时。所以用一种特殊的技巧。矩阵快速幂。
初始矩阵为
1 0
0 1
转化矩阵为
1 1
1 0
不懂矩阵快速幂的可以看一下我的这篇博客:https://blog.youkuaiyun.com/pk__pk/article/details/78954671
所以代码为:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const long long mod = 1000000009;
struct mat{
long long m[2][2];
}ans;
mat base = {1,1,1,0};
mat multi(mat a,mat b){
mat tmp;
for(long long i = 0 ; i < 2 ; i ++){
for(long long j = 0 ; j < 2 ; j ++){
tmp.m[i][j] = 0;
for(long long k = 0 ; k < 2 ; k ++){
tmp.m[i][j] += (a.m[i][k]*b.m[k][j])%mod;
tmp.m[i][j] %= mod;
}
}
}
return tmp;
}
long long mat_pow(mat a,long long n){
ans.m[0][0] = ans.m[1][1] = 1;
ans.m[0][1] = ans.m[1][0] = 0;
while(n){
if(n&1)
ans = multi(ans,a);
a = multi(a,a);
n >>= 1;
}
return ans.m[0][1];
}
int main(){
long long n ;
cin >> n;
cout << mat_pow(base,n) << endl;
}