폴 (Paul)이 제안한대로 1에서 100 사이의 각 숫자의 빈도 카운트부터 시작하십시오. 그러면 길이 100의 배열 freq []가 생성됩니다.
다음으로, 배열에서 트리플 A, B, C를 반복하고 A^B^C = 0 조건을 테스트하는 대신, A, B 쌍의 루프 A, B를 반복합니다. A < B. 각각의 A, B에 대해 C = A^B를 계산하여 (이제 A^B^C = 0이되도록) A < B < C < 100을 확인하십시오 (임의의 순서로 모든 트리플이 발생합니다. 이것은 트리플을 놓치지 않습니다.하지만 아래 참조).세 다른 번호의 모든 트리플 이후 < B.
위에 루프에 대해 5000 워크는 주파수 카운트 (N) O이다
Sum+=freq[A]*freq[B]*freq[C]
플러스 : 누적 합계는 같을 것이다 A, B, C가 어떤 순서로 발생해야합니다. 이렇게하면 각 트리플을 정확히 한 번 찾습니다. 다음으로 두 숫자가 같은 트리플을 찾아야합니다. 그러나 두 숫자가 같고 세 개 중 xor가 0이면 세 번째 숫자는 0이어야합니다. 따라서 이것은 빈도 카운트 배열에 대한 B에 대한 2 차 선형 검색으로 발생합니다 (A = 0, B = C < 100). (이 경우에 특히주의를 기울여야하며 특히 B = 0 인 경우주의하십시오. 카운트는 단지 주파수 [B] ** 2 또는 주파수 [0] ** 3이 아닙니다. 3. 거기에 약간의 조합 문제가 숨어 있습니다.)
희망이 도움이됩니다.
그냥 궁금해서 .... 숙제가 아니라면 무엇입니까? – BeemerGuy
면접 질문 은요? 그렇지 않다면, 이것이 어떻게 사용될 것인지 설명해 주시겠습니까? 저는 지금 당장이 신청서를 생각할 수 없습니까? –
It is Project Euler 310 :), 문제의 반을 해결할 수 있습니다 ... btw, O (n^3)가 우리가 말하는대로 실행 중입니다. – st0le