※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 11643번 문제인 The Magical 3이다.
문제는 아래 링크를 확인하자.

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

 

어떤 양의 정수 nb진법으로 나타냈을 때의 일의 자리가 3이라는 것은 3<b이며 nb로 나누었을 때의 나머지가 k와 같다는 것과 동치이다. 따라서 n3은 음이 아닌 b의 배수여야 한다.

 

위의 관찰을 이용하면 답의 후보로 살펴야 하는 수는 n3의 약수 뿐임을 알 수 있다. n3의 모든 약수에 한 번씩 접근하여 가능한 답의 최솟값을 구해 문제를 해결하자. 이는 테스트케이스 당 시간복잡도 O(n)에 수행할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

ll N;

void solve() {
    if (N < 3) {
        cout << "No such base\n";
        return;
    }
    else if (N == 3) {
        cout << 4 << '\n';
        return;
    }
    N -= 3;
    ll ans = 1000000000000000007LL;
    for (ll k = 1; k * k <= N; k++) {
        if (N % k) continue;
        if (k > 3) ans = min(ans, k);
        if (N / k > 3) ans = min(ans, N / k);
    }
    if (ans < 1000000000000000007LL) cout << ans << '\n';
    else cout << "No such base\n";
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N;
    while (N) {
        solve();
        cin >> N;
    }
}
728x90

+ Recent posts