我在几天前的编程挑战中遇到了这个问题。

java - 带有GCD的大型斐波那契-LMLPHP

java - 带有GCD的大型斐波那契-LMLPHP

我只有20个后端通过了一个测试用例。这是我的解决方案

import java.util.Scanner;
class TestClass {
    public static void main(String args[] ) throws Exception {
        Scanner s = new Scanner(System.in);
        int size = s.nextInt();
        int[] input = new int[size];


        long[] fiboDp = new long[1000000];
        fiboDp[0] = 0;
        fiboDp[1] = 1;

        for(int index = 2;index<1000000;++index) {
            fiboDp[index] = (fiboDp[index-1]%1000000007+fiboDp[index-2]%1000000007)%1000000007;

        }

        int query = s.nextInt();

        for(int index = 0; index < size; ++index) {
           input[index] = s.nextInt();
        }

        long[][] dpans = new long[size][size];

        for(int i = 0; i < size; ++i) {
            long gcdAns = fiboDp[input[i]];

            for(int j = i; j < size;++j) {
                if(i == j) {
                   dpans[i][j] = gcdAns;
                }
                else {
                    dpans[i][j] = gcd(dpans[i][j-1],fiboDp[input[j]]);
                }
            }
        }

        while(query > 0) {
            int left = s.nextInt();
            left = left-1;
            int right = s.nextInt();
            right = right-1;

          //  long ansGCD = fiboDp[input[left]];
          //  for(int index =left ; index<= right;++index) {
          //      ansGCD = gcd(ansGCD,fiboDp[input[index]]);
          //  }
            System.out.println(dpans[left][right]);
            query--;
        }
    }

    static long gcd(long a, long b) {
        return b == 0? a : gcd(b,a%b);
    }

}


我想我知道我的代码为什么错误,因为数组的元素大小为10 ^ 9,斐波那契数组的大小可以达到10 ^ 6。而且,每当我访问较大的索引时,都会发生数组超出范围的异常。但我不知道该如何解决。还有其他方法吗?

最佳答案

范围查询的问题通常使用段树来解决。
从竞争性编程开始,这是一个很好的基础数据结构。

现在,我想说一个好的财产,即。
GCD(Fibo(a [l]),Fibo(a [l + 1]),...,Fibo(a [r]))= Fibo(GCD(a [l],a [l + 1],... ..,a [r]))。

先决条件:
1.使用段树=> GeeksForGeeks查找范围的GCD
2.在O(log n)中快速找到斐波那契。

我的C ++代码中所有通过的案例:HackerEarth

10-06 01:04