알고리즘/문제 풀이

1009번: 분산처리

Themion 2021. 12. 5. 20:04

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

 

1009번: 분산처리

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)

www.acmicpc.net

i번 데이터는 (i % 10) + 1번 컴퓨터에서 처리하고 데이터는 1번부터 a^b번 데이터까지 있으므로, 구하고자 하는 값은 (a^b) % 10이다.

또 자연수 i의 거듭제곱의 1의 자리는 항상 순환하는데, 이는 i의 1의 자리 수에 따라 결정된다.

따라서 1 <= i <= 10일 때 i의 거듭제곱의 1의 자리 수를 미리 계산해 10 * 4 크기 배열에 저장한 뒤 a % 10, b % 4를 인덱스 삼아 배열에 접근하면 빠르게 답을 출력할 수 있다.

#include <cstdio>

// e[a][b]: a^(b % 4)의 1의 자리 수
int e[10][4] = {{10, 10, 10, 10},
                { 1,  1,  1,  1},
                { 6,  2,  4,  8},
                { 1,  3,  9,  7},
                { 6,  4,  6,  4},
                { 5,  5,  5,  5},
                { 6,  6,  6,  6},
                { 1,  7,  9,  3},
                { 6,  8,  4,  2},
                { 1,  9,  1,  9}};
 
int main() {
    // T: 테스트 케이스의 수
    // a, b: a^b의 1의 자리 수를 구할 때 필요한 데이터
    int T, a, b;

    // 테스트 케이스를 입력받아 각 테스트 케이스마다
    scanf("%d", &T);
    while (T--) {
        // a와 b를 입력받는다
        scanf("%d %d", &a, &b);
        // a^b의 1의 자리 수는 (a % 10)^(b % 4)의 1의 자리 수와 같다
        printf("%d\n", e[a % 10][b % 4]);
    }

    return 0;
}

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1011번: Fly me to the Alpha Centauri  (0) 2021.12.05
1010번: 다리 놓기  (0) 2021.12.05
1008번: A/B  (0) 2021.12.05
1005번: ACM Craft  (0) 2021.12.05
1004: 어린 왕자  (0) 2021.12.04