#include
using namespace std;
double fib(int n) ;
int main()
{
int n;
cin>>n;
double a[20000];
for(int i=0;i>a[i];
double b[20000];
for(int j=0;ja[j]){
b[j]=fib(i-1);
break;
}
}}
for(int i=0;i

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
应该是矩阵+快速幂!
如果你问的是c++,我觉得优化的余地大概是把cin,cout换成scanf,printf,或者用模板在编译期完成计算。
但是这题显然要的是语言层面以外的优化,方法就是楼上说的矩阵快速幂,不过sicp上还有一个看起来很玄学的fibonacci算法,有兴趣可以看看:-)
楼上都是瞎说 这题其实考的是二分搜索hehe~
--------------分割线--------
作为一个后端的nodejs新手 我决定用lua来实现给你看
看了楼下答案以后默默把MAX改成48...
c++14可以用constexpr + array + index_sequence直接生成fib数组,然后用lower_bound查询就行了。
你用double干什么 double是浮点数
浮点运算慢啊
长的整型用long long
你用了int,而int最大只能到2^31 - 1
于是遇到些奇怪的m值的话,你算出来的fib会不断溢出成负数,然后死循环。
既然1 <= n <= 20000,你先把它们全算出来,硬编进源码里,要用时二分搜索就行了。
(楼上那些constexpr之类的高级技巧,本质上也是这样干,不过是由编译器在编译时代劳了……)
当然,再进阶一点的话,你可以用
n = log(m * sqrt(5)) / log((sqrt(5) + 1) / 2)作为搜索起点。因为
fib(n) = round(((sqrt(5) + 1) / 2)^m / sqrt(5))但其实上面这些都没甚么意义,因为fib(48) = 4,807,526,976,已经比2^32大了。
所以其实你只需要unsigned int[48],根本不需要20000位。
你甚至可以硬编码出一堆if else来做这题……