所以我有一个寻找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)
我非常感谢你的帮助。
谢谢。