2012-05-02 5 views
1

입력은 최대 1000,000 개의 요소가있는 부울 배열 a_0,i입니다.인접한 xor를 계산합니다.

새로운 배열 인접 (환상) 이전 배열 요소 xor가 이루어질 때마다 :

a_t,i = a_t-1,i^a_t-1,(i+1)%n  // n is size of input 

또한, p 번째의 배열 (a_p, I)의 수배 (p < = 1000,000,000.).

p의 상한선에 따르면 어쩌면 배열 구조가 있다고 생각하거나 O(lg(p) * n)에서 배열을 계산할 수 있습니다.

+2

SO 대상 사용자를위한 질문은 무엇입니까? –

+1

또한 big-O 표기법을 사용하고 있으며 이는 무한대로 성장한다는 것을 의미합니다. 이것은'n'과'p'에 제약 조건을 지정했다는 사실과 충돌합니다. –

+0

@OliCharlesworth : 제약 조건 지정은 힌트입니다. O (n * p)보다 나은 솔루션이 있음을 보여줍니다! –

답변

2

톤 두 (t = 2 K)의 전원 인 경우, 또한

a_t,i = a_0,i^a_0,(i+t)%n 

, t는 두 성분의 합이며, 그 중 하나가 2의 제곱 (경우 t = V +, w 2 미터) = w

a_t,i = a_v,i^a_v,(i+w)%n 

이 반복적으로 생성 된 어레이를 계산하기 위해 P의 이진 표현을 사용하는 수있다. 복잡성은 다음과 같습니다. O (lg (p) * n) :

shift = 1; 
while (p != 0) 
{ 
    if (p&1) 
    a ^= a.rotate(shift); 
    shift *= 2 
    p /= 2 
} 
+0

당신은't = v + w'이고 v와 w가 2의 거듭 제곱이라고했을 때'a_t, i = a_v, i^a_w, i'하지만 오른쪽에서 왼쪽 이진 방법 방법에서는 v와 w는 반드시 힘 2의. –

+0

@ a-z, 오른쪽,이 문제는 모듈러 지수보다 훨씬 간단합니다. 우리는 2의 거듭 제곱에 대해 직접 배열을 계산할 수 있기 때문입니다. –

+0

당신은 두 번째 수식이'v'와'w'에 대해 작동한다는 것을 의미합니까? (두 단수가 아닌) –