2015-01-03 140 views
-4

给出一个大小为N的整数数组A.您将得到Q查询,其中每个查询由两个整数L,R表示。您必须找到gcd(最大公约数)不包括部分从范围左至右包容性的后阵列

数组的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); 
} 

但这种做法给我时间超出限制的错误,我怎样才能提高我的alogrithm

+0

gcd从哪里来? – ChiefTwoPencils

+0

@ChiefTwoPencils已更新 – user162091

+0

你有没有想过把它分解成两个; 'k = 0 ... ChiefTwoPencils

回答

2

您可以预先计算gcd为每个pre修复和后缀(我们称之为gcdPrefixgcdSuffix)在O(n * log MAX_A)时间(只需从左到右迭代数组并存储当前的gcd,然后从右到左执行相同的操作)。 (L, R)查询的答案是gcd(gcdPrefix[L - 1], gcdSuffix[R + 1])(因此每个查询的操作为O(log MAX_A))。总时间复杂度为O((n + q) * log MAX_A)。我认为它应该足够快。

+0

为什么这个!!!请给我们证明! – user162091

+0

@ user162091究竟是什么不清楚?每个查询都是前缀和后缀的联合(因为我们根据问题声明排除了中间部分)。 – kraskevich

+0

'每个查询都是一个前缀和一个后缀的联合'它是什么意思请解释它如何'gcd(gcdPrefix [L-1],gcdSuffix [R + 1])'这个东西工作 – user162091