2015-01-03 4 views
-4

크기 N의 정수 A 배열이 주어집니다. 각 쿼리가 두 개의 정수 L, R로 표시되는 Q 쿼리가 제공됩니다. gcd (Greatest Common Divisor)를 찾아야합니다. 포함 R에 범위 L의 부분을 제외한 후 배열

배열의 GCD

MY 접근 :

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); 
} 

그러나이 방법은 나에게 내가

+0

gcd의 출처는 어디입니까? – ChiefTwoPencils

+0

@ChiefTwoPencils 업데이트 됨 – user162091

+0

두 분으로 나누어 보셨습니까? 'k = 0 ... ChiefTwoPencils

답변

2

당신은 미리 계산 할 수 있습니다 내 고리즘을 향상시킬 수있는 방법은 시간 제한 초과 오류를주는 각 사전에 대한 gcd 수정 및 접미사 (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