Skip to content
총 23개의 글이 있습니다.
투에-모스 수열(Thue-Morse Sequence)은 0에서 시작하여, 매 단계마다 현재 수열의 보수(0↔1)를 뒤에 붙여 확장하는 이진 수열이다.
S₀ = 0S₁ = 01S₂ = 0110S₃ = 01101001S₄ = 0110100110010110
n번째(0-indexed) 원소 T(n)은 n의 이진 표현에서 1의 개수의 parity와 같다. 1의 개수가 짝수면 0, 홀수면 1이다.
n = 0 → 0 (이진: 0, 1의 개수: 0, 짝수) → T(0) = 0n = 1 → 1 (이진: 1, 1의 개수: 1, 홀수) → T(1) = 1n = 2 → 1 (이진: 10, 1의 개수: 1, 홀수) → T(2) = 1n = 3 → 0 (이진: 11, 1의 개수: 2, 짝수)
보드판 크기를 N이라 두자.
N을 6으로 나눈 나머지가 2 또는 3이 아니라면, 1부터 N까지의 수를 (짝수 오름차순) + (홀수 오름차순)으로 나열하도록 배치하면 된다.
N을 6으로 나눈 나머지가 2이라면, 앞선 홀수 오름차순 리스트에서 1과 3의 위치를 바꾸고 5를 맨 뒤로 보낸다.
즉 (짝수 오름차순), (3, 1, 7, 9, …, 5) 꼴이 될 것이다.
N을 6으로 나눈 나머지가 3이라면, 2를 짝수 오름차순 리스트의 맨 끝으로 보내고 1, 3을
구간 업데이트(덧셈)가 있을 때 쿼리마다 구간의 gcd를 구하는 문제이다.
각 구간별 gcd를 세그먼트 트리로 저장하는 일반적인 방법으로는 시간초과가 발생한다. 구간에 수를 더하면 gcd를 다 다시 계산해야하기 때문이다.
수를 더했을 때 gcd를 모두 재계산하는 것을 막기 위해선 gcd(a, b) = gcd(a, a-b)라는 성질을 활용해야한다. 이 식을 확장하면 gcd(a, b, c, d, e) = gcd(a, |b-a|, |c-b|, |d-c|, |e-d|)라는 것을 알 수 있다.
세그먼트 트리의 각 노드에서 gcd(|b-a|, |c-b|, |d-c|, |e-d|)를 관리한다고 했을 때, b, c, d에 x만큼을 더하면 |c-b|와