C++ Fibbonacci序列中的边情况

C++ Fibbonacci序列中的边情况,c++,math,dynamic-programming,fibonacci,C++,Math,Dynamic Programming,Fibonacci,这是我的第一个堆栈溢出问题。我将尝试对我的问题进行全面描述,并提出具体问题 我在一个在线法官身上做一个编程任务,要求我返回斐波那契数列mod m的第n项,其中m是一个整数,这样1≤ M≤ 300000这是我目前掌握的代码 #include <bits/stdc++.h> using namespace std; map<long long, long long> memo; long long m; long long f; int fib(long long n) {

这是我的第一个堆栈溢出问题。我将尝试对我的问题进行全面描述,并提出具体问题

我在一个在线法官身上做一个编程任务,要求我返回斐波那契数列mod m的第n项,其中m是一个整数,这样1≤ M≤ 300000这是我目前掌握的代码

#include <bits/stdc++.h>
using namespace std;

map<long long, long long> memo;
long long m;
long long f;
int fib(long long n) {
    for (int i = 0; i < n + 1; i++) {
        if (i <= 2) {
            memo[0] = 0;
            memo[1] = 1;
            memo[2] = 1;
        } else {
            f = memo[i - 1] + memo[i - 2];
            memo[i] = f;
        }
    }
    return memo[n];
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    long long n;
    cin >> n >> m;

    if (m == 1) {
        cout << 0 << '\n';
    } else {
        cout << abs(fib(n) % m) << '\n';
    }

    return 0;
}
#包括
使用名称空间std;
地图备忘录;
长m;
长f;
内纤(长n){
对于(int i=0;in>>m;
如果(m==1){
库特
可能导致溢出

你应该这样做

            f = (memo[i - 1] + memo[i - 2]) % m;

相反。

还有一个:

#包括
使用名称空间std;
双fib(int n){
双a=0;
双b=1;
对于(int i=0;i
你溢出了-第30000个斐波那契数大约有200000个二进制数字,而你只有63个。当答案应该是模一些
m
时,总是暗示中间结果将溢出,除非你知道标识
(a+b)%m==(a%m+b%m)%m
(a*b)%m==(a%m*b%m)%m
。如果您唯一声明的目标是返回第n个
数字,为什么您需要一张地图来记录每个计算到该数字的数字?这是没有意义的。哦,顺便说一下,如果您试图直接计算,它将不起作用,因为一些明显的原因。就像那些无用的在线比赛上的所有愚蠢的谜题一样没有人真正关心的是,你需要知道一个特殊的数学技巧来解决这个难题。在计算这个过程中有一个数学技巧,这和C++没有任何关系。如果你不知道这个窍门是什么,你就不能解决它。我不知道有任何国家需要有人在CoeCeChf上浪费时间。或者类似的东西,为了获得奖学金。另外,你只需要存储最后两个数字。@SamVarshavchik介绍新加坡。那里所有的事情都必须有竞争性。对不起,我不太明白你在第一个技巧中使用的第二个技巧。这不意味着下面的语句f=memo[I]将成为incorrect@pnkasdhith我的口号是:先做数学。这涵盖了所有你需要的:。寻找“分布式”对于你需要在这里应用的关系,谢谢,我会研究这个数学,就像我一开始说的,这是一个数学把戏。你会花很多时间来弄清楚这里的数学把戏是什么。不幸的是,那些竞争性编码网站上的愚蠢的谜题并不是每次都使用相同的把戏。所以,这对那些竞争性编码网站来说真的没有帮助毕竟。因为下一次你需要知道一个不同的编程或数学技巧。所以,你看,你花了所有的时间学习一个技巧,但从长远来看,它不会对你有多大帮助,你同意吗?这个函数适用于C#,Python,可能还有Ruby。如果我错过了一个角色,这就是为什么我是巴西人。
            f = (memo[i - 1] + memo[i - 2]) % m;
            f = memo[i - 1] + memo[i - 2];
            while (f >= m) f -= m;