Skip to content
CatBus
Go back

[BOJ] 분산 처리 - 1009 (B2)

시간 제한메모리 제한
1 초128 MB

문제

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

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

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

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

입력

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

출력

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

풀이

주어진 숫자는 제곱의 형태로 주어지며 최대 10000001001000000^{100}이 될 수 있기 때문에 컴퓨터로 처리하는 것을 모두 시뮬레이션하는 것으로는 시간 제한을 맞출 수 없다. 모두 확인하지 않고 어떤 컴퓨터가 처리했는지 알 수 있는 방법은 주어진 숫자의 1의 자리를 활용하는 것이다. 어떤 1의 자리의 수를 n번 곱하면 계산된 수의 1의 자리가 주기적으로 반복되는 것을 알 수 있고 그 수는 아래와 같이 나타낼 수 있다.

nums = {1 : [1],
        2 : [2, 4, 8, 6],
        3 : [3, 9, 7, 1],
        4 : [4, 6],
        5 : [5],
        6 : [6],
        7 : [7, 9, 3, 1],
        8 : [8, 4, 2, 6],
        9 : [9, 1]}

하지만 무턱대고 aba^b를 계산해서 1의 자리를 구한다고 해도 중복되는 값들이 있기 때문에 정확히 어떤 수의 제곱인지 알 수 없다. 그래서 먼저 a를 nums의 키로 넣어 제곱 했을 때 1의 자리에 나올 값들을 추려내고 그 중 b번째 값을 답으로 출력한다. b번째 값이 답이 될 수 있는 이유는 a를 b번 곱하는 동안에 1의 자리의 값도 b번 바뀔 것이기 때문이다.

예를 들어 a가 124, b가 16이라고 하면 다음과 같은 과정을 거치게 된다.

n = int(input())

nums = {1 : [1],
        2 : [2, 4, 8, 6],
        3 : [3, 9, 7, 1],
        4 : [4, 6],
        5 : [5],
        6 : [6],
        7 : [7, 9, 3, 1],
        8 : [8, 4, 2, 6],
        9 : [9, 1]}

for _ in range(n):
    a, b = map(int, input().split())
    # a의 1의 자리수를 구한다 -> 4
		one = a % 10

		# 1의 자리에 나올 수 있는 값들을 가져온다 -> nums[4] -> [4, 6]
		# 이 중에서 b번째 값을 취한다. 4, 6, 4, 6, 4, 6 -> 6
    print(nums[one][(b - 1) % len(nums[one])])

단 a의 1의 자리가 0일 경우 무조건 제곱한 수의 1의 자리도 0이므로 10번 컴퓨터가 처리하게 된다.

a, b = map(int, input().split())
one = a % 10
if  not one:
    print(10)

코드

n = int(input())

nums = {1 : [1],
        2 : [2, 4, 8, 6],
        3 : [3, 9, 7, 1],
        4 : [4, 6],
        5 : [5],
        6 : [6],
        7 : [7, 9, 3, 1],
        8 : [8, 4, 2, 6],
        9 : [9, 1]}

for _ in range(n):
    a, b = map(int, input().split())
    one = a % 10
    if  not one:
        print(10)
    else:
        print(nums[one][(b - 1) % len(nums[one])])

Share this post:

비슷한 글

1009이 글—

본문을 Xenova/multilingual-e5-small 로 임베딩하고, 그 벡터를 PCA 로 32축에 눌러 왼쪽 막대로 그렸습니다. 비슷한 글은 지문도 닮습니다 — 위아래를 견줘 보세요. 계산은 빌드 때 끝나고 벡터는 브라우저로 오지 않습니다.

Previous Post
Attention 메커니즘 정리 - Seq2Seq에서 Transformer까지
Next Post
[BOJ] 에디터 - 1406 (S2)