Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阵列的GCD_Java_Algorithm_Greatest Common Divisor - Fatal编程技术网

Java 阵列的GCD

Java 阵列的GCD,java,algorithm,greatest-common-divisor,Java,Algorithm,Greatest Common Divisor,您将得到一个由大小为N的整数组成的数组A。您将得到Q查询,其中每个查询由两个整数L,R表示。您必须在排除范围为L到R(包括L到R)的部分后找到数组的gcd(最大公因数) 我的做法: public static int gcd(int a ,int b) { if(b == 0) return a; return gcd(b, a % b); } for(int j = 0; j < Q; j++) { int l = in.nextInt(); int r

您将得到一个由大小为N的整数组成的数组A。您将得到Q查询,其中每个查询由两个整数L,R表示。您必须在排除范围为L到R(包括L到R)的部分后找到数组的gcd(最大公因数)

我的做法:

public static int gcd(int a ,int b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}

for(int j = 0; j < Q; j++) {
    int l = in.nextInt();
    int r = in.nextInt();
    ans = 0;
    for(int k = 1; k <= n; k++) {
        if(k < l || k > r) ans = gcd(a[k], ans);
    }
    System.out.println(ans);
}
publicstaticintgcd(inta,intb){
如果(b==0),则返回a;
返回gcd(b,a%b);
}
对于(int j=0;j

但是这种方法给了我超出时间限制的错误。我如何改进我的计算方法?你可以在
O(n*log MAX_A)
时间中为每个前缀和后缀(我们称之为
gcdPrefix
gcdSuffix
)预计算gcd(只需从左到右遍历您的数组并存储当前的gcd,然后从右到左执行相同的操作。)
(L,R)
查询的答案是
gcd(gcdPrefix[L-1],gcdSuffix[R+1]
)(因此它是
O(log MAX_a)
每个查询的操作。总时间复杂度是
O((n+q)*log MAX_a)
。我认为应该足够快。

gcd从何而来?@chieftwoils updated你有没有想过把它一分为二;
k=0…你确定
for(int k=1;k这是正在进行的CodeChef中的一个问题。请删除这个问题。@user162091到底什么不清楚?每个查询都是前缀和后缀的联合(因为根据问题陈述,我们排除了中间部分)`每个查询都是前缀和后缀的结合`这是什么意思?请解释一下如何
gcd(gcdPrefix[L-1],gcdSuffix[R+1])
working@user162091我们排除了部分
[L,R]
。剩下的是什么?
[1,L-1]
[R+1,N]
(前缀和后缀)。gcd(a[1],…,a[L-1])是
gcdPrefix[L-1]
。gcd(a[R+1],…,a[N])是
gcdSuffix[R+1]
。这就是为什么gcd(a[1],…,a[L-1],[R+1],…,a[N])是gcd(gcdPrefix[L-1],gcdSuffix[R+1])。