2 solutions

  • 3
    @ 2025-5-5 20:16:18

    采用了记忆化策略,设置了一个记忆点,在输入的所有的n都小于10^6的情况下,可以节省一点点计算量

    #include <iostream>
    using namespace std;
    const int MOD=1e9+7;
    int A[1000000];//申请足够大的空间
    int p=1;//记忆点,当前数组所计算到的最远的位置
    int fib(int n)
    {
        if(n>p)//如果当前的fib(n)并未算出,则需要迭代计算
        {
            for(int i=p+1;i<=n;i++)
            {
               A[i]=(A[i-1]+A[i-2])%MOD;
            }
            p=n;//更新记忆点,防止重复计算
        }
        return A[n];
    }
    int T,n;
    
    int main()
    {
        A[0]=0;A[1]=1;//fib(0)和fib(1)单独初始化
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            printf("%d\n",fib(n));
        }
    }
    

    Information

    ID
    17
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    1
    Tags
    # Submissions
    96
    Accepted
    27
    Uploaded By