알고리즘/문제 풀이

2312번: 수 복원하기

Themion 2021. 12. 15. 16:53

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

 

2312번: 수 복원하기

첫째 줄에 테스트 케이스의 수가 주어진다. 각 테스트 케이스마다 양의 정수 N (2 ≤ N ≤ 100,000)이 주어진다.

www.acmicpc.net

N의 크기가 작으므로 일일이 인수와 그 차수를 구해도 빠르게 문제를 풀 수 있다.

#include <cstdio>

void test_case() {
    // N: 인수를 계산할 수, cnt: 각 인수의 차수
    int N, cnt;

    // N을 입력받은 뒤
    scanf("%d", &N);

    // 2부터 차례로 인수를 계산
    for (int i = 2; N > 1; i++) {
        // 인수의 차수를 초기화한 뒤
        cnt = 0;
        // N이 i로 나누어 떨어질 때마다
        while (!(N % i)) {
            // N을 i로 나누고 cnt를 1 더함
            N /= i;
            cnt++;
        }
        // cnt가 0이 아니라면 N이 i로 나누어 떨어진다는 뜻이므로
        // 인수 i와 그 차수 cnt를 출력
        if (cnt) printf("%d %d\n", i, cnt);
    }
}

int main() {
    // T: 테스트 케이스의 수
    int T;
    // 테스트 케이스를 입력받은 뒤 각 테스트 케이스의 결과를 출력
    scanf("%d", &T);
    while (T--) test_case();

    return 0;
}