📌  相关文章
📜  对Q查询的Fibonacci数字总和范围内的K可整除的数字进行计数(1)

📅  最后修改于: 2023-12-03 15:09:28.141000             🧑  作者: Mango

题目描述

输入一个正整数 Q 和 K,计算在 Fibonacci 数字总和范围内,有多少个数能被 K 整除。

解题思路

首先需要了解 Fibonacci 数列的定义,Fibonacci 数列的第一个数字为 0,第二个数字为 1,从第三个数字开始,每个数字都是前面两个数字的和。即:

F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 (n ≥ 2)

接着计算 Fibonacci 数列的前 Q 个数字的总和 sum,需要使用循环计算,代码示例:

long long sum = 0, f1 = 0, f2 = 1, fn;
for (int i = 0; i < Q; i++) {
    fn = f1 + f2;
    f1 = f2;
    f2 = fn;
    sum += fn;
}

最后统计在 sum 的范围内,有多少个数字能被 K 整除。可以使用循环判断每个数字是否能被 K 整除,代码示例:

int cnt = 0;
for (long long i = 0; i <= sum; i++) {
    if (i % K == 0) {
        cnt++;
    }
}
完整代码
#include <iostream>
using namespace std;

int main() {
    int Q, K;
    cin >> Q >> K;

    long long sum = 0, f1 = 0, f2 = 1, fn;
    for (int i = 0; i < Q; i++) {
        fn = f1 + f2;
        f1 = f2;
        f2 = fn;
        sum += fn;
    }

    int cnt = 0;
    for (long long i = 0; i <= sum; i++) {
        if (i % K == 0) {
            cnt++;
        }
    }

    cout << cnt << endl;

    return 0;
}
复杂度分析

时间复杂度:

  • 计算 Fibonacci 数列的前 Q 个数字的总和需要循环 Q 次,每次计算需要常数时间,因此时间复杂度为 O(Q)。
  • 统计在 sum 范围内能被 K 整除的数字需要循环 sum/K 次,每次判断需要常数时间,因此时间复杂度为 O(sum/K)。
  • 总时间复杂度为 O(Q + sum/K)。

空间复杂度:

  • 只使用了常数个变量,因此空间复杂度为 O(1)。