小A非常喜欢研究数学问题,以至于他会尽量把生活中所有的事情都和数学问题靠拢。在所有的序列中,他对斐波拉契数列情有独钟。这不,他在逛街时发现有卖甘蔗的,想买根甘蔗尝尝。他希望购买的甘蔗长度是斐波拉契数列中若干连续元素的和。 斐波拉契数列是一个整数序列,定义为:f0 = 1, f1 = 1, …, fn = fn − 1 + fn − 2 请你帮他计算一下,甘蔗的长度是他想要的吗? 输入数据 输入数据不超过1000组,每组数据为一行,包括一个正整数n(1≤n≤1015) ,表示甘蔗的长度。 输出数据 对每组测试数据,若其为斐波拉契数列中若干个连续元素的和,请输出YES,否则输出NO。
时间: 2024-03-16 17:43:39 浏览: 128
FJSP_algorithm-模拟退火算法
这道题可以使用斐波那契数列的性质来解决。具体来说,我们可以枚举斐波那契数列中相邻的两个数 f[i] 和 f[i+1],然后判断甘蔗的长度是否等于 f[i+1]。如果是,则说明甘蔗的长度是斐波那契数列中连续的若干个数的和。
我们可以用两个指针 l 和 r,表示斐波那契数列中相邻的两个数 f[l] 和 f[r]。初始时,l=0,r=1。然后,我们可以计算 f[r],并判断甘蔗的长度是否等于 f[r]。如果是,则输出 YES,否则将 l 和 r 分别加 1,继续计算下一个斐波那契数列中相邻的两个数。
时间复杂度为 O(log(n)),其中 n 为甘蔗的长度。具体来说,我们需要计算不超过甘蔗长度的最大斐波那契数。斐波那契数列的增长速度是指数级别的,因此最多需要计算 O(log(n)) 个斐波那契数。
下面是代码实现:
```
#include <iostream>
using namespace std;
typedef long long LL;
int main() {
LL n;
while (cin >> n) {
LL f1 = 1, f2 = 1;
while (f2 < n) {
LL tmp = f1 + f2;
f1 = f2;
f2 = tmp;
}
if (f2 == n) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
```
阅读全文