这是 PE-2 的手动O(1)- ish解决方案,请参阅上面 @harold :( 的评论。我的解决方案是伪数学的,并不严格,但是嘿,它有效!
\n\n\n斐波那契数列中的每一项新项都是通过添加前两项而生成的。从 1 和 2 开始,前 10 项将是:
\n1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 通过考虑\n斐波那契数列中值不超过四百万的项,求\n偶数项的总和。
\n
一些构建块:
\nE 1 + E 2 + ... + E k = (E k+2 - 3E k+1 - 2) \xc3\xb7 4 = (F 3(k+2) - 3F 3(k+1) - 2 ) \ xc3\xb7 4因为En = F 3n
\n\n而不是上限,我们取底以获得低于X 的斐波那契数的索引n。那么我们只需计算{F 0 , ..., F n }中有多少个偶数,并使用第3点的公式即可。
\nC 实施:
\n我用暴力解决方案对其进行了测试。似乎工作正常。
\n#include <stdio.h>\n\n#include <math.h>\n\n// Input N\n// Output N\'th term of fibonacci\nunsigned long long binet(int N)\n{\n long double phi = (1.0 + sqrt(5)) / 2.0;\n\n return floor((pow(phi, N) / sqrt(5)) + 0.5);\n}\n\nint find_fib_n(unsigned long long F_n)\n{\n return round(log(sqrt(5) * F_n) / log((1.0 + sqrt(5)) / 2.0));\n}\n\n// Input N\n// Count of even numbers in the first N fib nums\nint count_even_in_fib_seq(int N)\n{\n if (N <= 3)\n return 0;\n\n int tmp = N;\n\n tmp -= 4;\n\n return 1 + floor(tmp / 3);\n}\n\n#define bound 4000000\n\nint main(void)\n{\n int fib_approx_index = find_fib_n(bound);\n\n printf("%d %llu %d\\n", fib_approx_index, binet(fib_approx_index), bound);\n\n // Number of even numbers below bound\n int K = count_even_in_fib_seq(fib_approx_index + 1);\n\n printf("count %d\\n", K);\n\n unsigned long long result = (-3 * binet(3 * (K + 1)) + binet(3 * (K + 2)) - 2) / 4;\n printf("%llu", result);\n}\nRun Code Online (Sandbox Code Playgroud)\n附录:前k个偶数斐波那契数之和的公式
\n\n在网上浏览了一段时间后,我发现其他一些人也提出了类似的解决方案。查看这些链接以获取更多信息:
\n谢谢阅读
\n