넘치게 채우기

[BOJ] 25306 - 연속 XOR 본문

PS/BOJ

[BOJ] 25306 - 연속 XOR

riveroverflow 2025. 9. 3. 11:42
728x90
반응형

https://www.acmicpc.net/problem/25306

BOJ - 연속 XOR

문제 유형: 수학, 비트마스킹

문제 난이도: Gold IV

시간 제한: 1초

메모리 제한: 1024MB

 

문제

준원이는 다음과 같이 A에서 까지의 자연수들을 나열했다.

이 수들에 모두 비트 XOR을 취한 값을 구하라.

 

입력

두 자연수 , 가 공백을 사이에 두고 주어진다.

 

출력

 이상  이하인 모든 자연수들을 XOR한 값을 구하여라.

 

풀이

물론 일일이 구하면 TLE에 걸린다.

대신, f(x)를 1 ... x까지의 XOR sum이라고 해보자.

 

최종적으로 f(b) ^ f(a-1)을 구하면 되는 것이다.

 

f(x), 즉 1 ... x의 XOR sum은 다음처럼 간단한 규칙을 가진다:

mod = x % 4라고 하자.

mod == 0인경우, x이다.

mod == 1인경우, 1이다.

mod == 2인경우, x+1이다.

mod == 3인경우, 0이다.

 

코드

Go

package main

import (
	"bufio"
	"fmt"
	"os"
)

var reader *bufio.Reader
var writer *bufio.Writer

func main() {
	reader = bufio.NewReader(os.Stdin)
	writer = bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var a, b int64
	fmt.Fscan(reader, &a, &b)

	ans := getXORSum(b) ^ getXORSum(a-1)
	fmt.Fprintln(writer, ans)
}

func getXORSum(n int64) int64 {
	mod := n % 4
	if mod == 0 {
		return n
	} else if mod == 1 {
		return 1
	} else if mod == 2 {
		return n + 1
	} else {
		return 0
	}
}

 

728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 29333 - One Walk  (0) 2025.09.06
[BOJ] 15569 - 블록 1  (0) 2025.09.04
[BOJ] 31791 - 바이러스 공격  (0) 2025.09.02
[BOJ] 특별한 서빙  (0) 2025.09.01
[BOJ] 24419 - 알고리즘 수업 - 행렬 경로 문제 2  (0) 2025.08.23