歪解
2024-07-08 18:47:57
发布于:广东
68阅读
0回复
0点赞
传送门
据斐波那契数列的特性,可知
.
所以我们可以根据这个解题:
当为奇数时,
.
当为偶数时,
.
所以我们就可以用分治方法解
代码如下
感谢@不是很邪恶的暑假神提供的map解法!
#include <iostream>
#include <cstdio>
#include <map>
#define int long long
using namespace std;
map <int, int> a;
const int mod = 1e9 + 7;
int fib(long long n){
if(a[n]) return a[n];
if(n & 2 == 1){
int l = fib(n / 2), r = fib((n / 2) + 1);
return a[n] = (l * l + r * r) % mod;
}
else return a[n] = fib(n / 2) * (fib((n / 2) - 1) + fib((n / 2) + 1)) % mod;
}
signed main(){
a[2] = a[1] = 1;
long long n;
cin >> n;
cout << fib(n);
return 0;
}
时间复杂度:.
全部评论 2
还有你在集训营打比赛干嘛
2024-07-21 来自 广东
0我REc
2024-07-21 来自 广东
0
有帮助,赞一个