본문 바로가기
Programming Solve/BOJ

BOJ 10464 - XOR / C++

by msm1029 2022. 4. 21.
반응형

문제 링크 : https://www.acmicpc.net/problem/10464

 

10464번: XOR

입력의 첫 번째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 1000)가 주어진다. 다음 T 개의 줄에는 두 개의 정수 S와 F가 주어진다. (1 ≤ S ≤ F ≤ 1 000 000 000)

www.acmicpc.net

 

 

풀이

S와 F의 범위는 1부터 10억까지이므로 이를 직접 XOR하면 당연히 시간초과가 발생한다.

 

규칙을 찾기 위해 1부터 n까지의 XOR을 구해보면

n       이진수       1부터 n까지의 XOR
1         1           [0001]
2        10           [0011]
3        11           [0000]  <----- 0
4       100           [0100]  <----- n
5       101           [0001]
6       110           [0111]
7       111           [0000]  <----- 0
8      1000           [1000]  <----- n
9      1001           [0001]
10     1010           [1011]
11     1011           [0000] <------ 0
12     1100           [1100] <------ n

n % 4 == 0일 때 n

n % 4 == 1일 때 1

n % 4 == 2일 때 n+1

n % 4 == 3일 때 0

의 규칙을 얻을 수 있다.

 

이를 이용하여 1부터 S-1까지의 XOR을 구하고 1부터 F까지의 XOR을 구한 뒤

두 값을 다시 XOR하면 S부터 F까지의 XOR을 구할 수 있다.

 

코드

#include <iostream>
using namespace std;

int findXOR(int n)
{
    int mod = n % 4;
 
    if (mod == 0) return n;
    else if (mod == 1) return 1;
    else if (mod == 2) return n + 1;
    else if (mod == 3) return 0;

    return 0;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    int n;
    cin >> n;

    for(int i=0; i<n; i++){
        int s, f;
        cin >> s >> f;
    
        cout << (findXOR(s - 1) ^ findXOR(f)) << '\n';
    }
}

 

 

 

 

 

출처 : https://www.geeksforgeeks.org/calculate-xor-1-n/

https://www.geeksforgeeks.org/find-xor-of-numbers-from-the-range-l-r/

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 5430 - AC / C++  (0) 2022.05.01
BOJ 9375 - 패션왕 신해빈 / C++  (0) 2022.05.01
BOJ 1107 - 리모컨 / C++  (0) 2022.04.21
BOJ 1074 - Z / C++  (0) 2022.04.21
BOJ 16928 - 뱀과 사다리 게임 / C++  (0) 2022.04.18