백준/Bronze

[백준] 1009 분산처리 (C++)

kevinmj12 2023. 1. 10. 21:42

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

 

1009번: 분산처리

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

www.acmicpc.net

문제

재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.

1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,

10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...

총 데이터의 개수는 항상 a^b개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.

입력

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

 

출력

각 테스트 케이스에 대해 마지막 데이터가 처리되는 컴퓨터의 번호를 출력한다.


풀이

문제에 따르면 데이터가 처리될 컴퓨터의 번호는 데이터의 번호를 10으로 나눈 값의 나머지이다. 즉 데이터의 번호에서 마지막 일의 자리 수가 곧 데이터가 처리되는 컴퓨터의 번호이다. 

그런데 데이터의 최대 개수는 매우 많다. 99^999999 를 직접 계산할 수는 없다. 하지만 일의 자리 수는 알아낼 수 있다.

 

a^b는 a를 b번 곱했다는 뜻으로 a * a * a ..... * a 꼴이다. 이 때 a의 값이 2, b의 값이 999라고 가정하자. 2를 반복하여 곱하면 2, 4, 8, 16, 32, 64, 128, 256, 512 ... 와 같이 수들이 나열되는데 일의 자리 수에 주목하자. 일의 자리 수는 2, 4, 8, 6, 2, 4, 8, 6, 2... 와 같이 [2, 4, 8, 6] 4개의 수가 반복하여 등장하는 것을 알 수 있다. 따라서 2^999의 일의 자리 수는 [2, 4, 8, 6] 에서 999를 4로 나눈 나머지 3번째 수 8임을 알 수 있다. 

a의 값이 3일 때도 마찬가지이다. 3을 반복하여 곱하면 3, 9, 27, 81, 243, 729, 2187, 6561, 19683... 와 같이 수들이 나열되고 일의 자리 수를 살펴보면 [3, 9, 7, 1] 4개의 수가 반복하여 등장하는 것을 확인할 수 있다. 

 

따라서 우리는 a를 4번 곱하며 반복되는 4개의 수를 구한 뒤, b를 4로 나눈 나머지를 구하여 일의 자리 수를 구할 수 있다.

 

코드

#include <iostream>
using namespace std;

int main() {
    int T;
    cin >> T;

    for (int i = 0; i < T; i++){
        int a, b;
        cin >> a >> b;

        int aArray[4];  // 반복되는 4개의 수 저장
        int lastNumA = a % 10;
        for (int i = 0; i < 4; i++){
            aArray[i] = lastNumA;
            lastNumA = lastNumA * a % 10;
        }

        int ans = aArray[(b-1)%4];

        if(ans){ // ans값이 0이 아닐 때
            cout << ans << endl;
        }
        else{ // ans 값이 0일 때
            cout << 10 << endl;
        }

    }

}