斐波那契,但起始号不同。代码适用于大多数情况,但不是全部

时间:2018-05-09 16:40:46

标签: c++ c++11 fibonacci

所以我有一个寻找Fibonacci序列但是起始编号不同的练习,我无法弄清楚为什么我的代码大部分时间都有效,但在某些情况下却没有。

我的代码基于公式(链接:https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/

If n is even then k = n/2:
F(n) = [2*F(k-1) + F(k)]*F(k)

If n is odd then k = (n + 1)/2
F(n) = F(k)*F(k) + F(k-1)*F(k-1)

-

#include <map>
#include <iostream>
#include <cmath>
using namespace std;

#define long long long
map<long, long> F;

long f(long n, long M) {
    if (F.count(n)) return F[n];
    long k = n / 2;
    if (n % 2 == 0) { // n=2*k
        return F[n] = (f(k, M)*f(k, M) + f(k - 1, M)*f(k - 1, M)) % M;
    }
    else { // n=2*k+1
        return F[n] = (f(k, M)*f(k + 1, M) + f(k - 1, M)*f(k, M)) % M;
    }
}

int main() {
        long a, b, M, n;
        cin >> a >> b >> n >> M;
        M = pow(10, M); //modulo
        F[0] = b;
        F[1] = a + b;
        //base cases
        for (int i = 2; i < 100; i++) F[i] = (F[i - 1] + F[i - 2]) % M;


        if (n != 0) cout << f(n - 1, M) << endl;
        else cout << a<<endl;

        F.clear();


}

a - 是序列的第一个数字。 b - 第二个。 n - 我想要找到的序列号。 m - modulo。

我不明白为什么它适用于像

这样的情况
98 25 1000000000 1              //answer is 3

但它不适用于

34 88 224242 2     //my answer is 12, correct is 92

代码适用于常规Fibonacci起始编号(0和1)

我非常感谢你的帮助。

谢谢。

0 个答案:

没有答案