백준 27725번 지수를 더하자

김두현·2024년 1월 8일
1

백준

목록 보기
132/135
post-thumbnail
post-custom-banner

🔒문제 url

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


🔑알고리즘

우선 문제부터 이해해보자.
i=10i = 10이고, P={2,3}P = \{2,3\}인 경우를 예로 들어 생각하면 아래와 같다.

i=1i = 1일 때, 12a1×3a2\frac{1}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 0 + 0 = 0 이다.

i=2i = 2일 때, 22a1×3a2\frac{2}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 1 + 0 = 1 이다.

i=3i = 3일 때, 32a1×3a2\frac{3}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 0 + 1 = 1 이다.

i=4i = 4일 때, 42a1×3a2\frac{4}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 2 + 0 = 2 이다.

i=5i = 5일 때, 52a1×3a2\frac{5}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 0 + 0 = 0 이다.

i=6i = 6일 때, 62a1×3a2\frac{6}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 1 + 1 = 2 이다.

i=7i = 7일 때, 72a1×3a2\frac{7}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 0 + 0 = 0 이다.

i=8i = 8일 때, 82a1×3a2\frac{8}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 3 + 0 = 3 이다.

i=9i = 9일 때, 92a1×3a2\frac{9}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 0 + 2 = 2 이다.

i=10i = 10일 때, 102a1×3a2\frac{10}{2^{a^1} \times 3^{a^2}}가 양의 정수를 만족하는 a1+a2a^1+ a^2의 최댓값은 1 + 0 = 1 이다.

따라서 최댓값의 합인 bi=1+1+2+2+3+2+1=12b_i = 1 + 1 + 2 + 2 + 3 + 2 + 1 = 12가 되어야 한다.

p1=2p1 = 2부터 생각해보자.
22로 나누어 떨어지는 ii2,4,6,8,102, 4, 6, 8, 10이다.
222^2로 나누어 떨어지는 ii4,84, 8이 되고,

이는 22로 나누어 떨어지는 수를 22로 한 번 더 나눌 수 있는 수와 같다.

위에 근거하여 표를 작성하면 아래와 같다.

즉, 각 가능한 모든 소인수에 대하여 나누어 떨어지는 수의 합이 출력 답안이 된다.


🐾부분 코드

void solution()
{
    ll ans = 0;
    for (auto p : prime)
    {
        ll temp = p;
        while (p <= k)
        {
            ans += k / p;
            p *= temp;
        }
    }
    cout << ans;
}

모든 소인수에 대하여, 해당 소인수로 나누어 떨어지는 ii의 갯수를 구하여 ans에 더한 뒤 출력한다.


🪄전체 코드

#include <bits/stdc++.h>

using namespace std;
#define IAMFAST ios_base::sync_with_stdio(false);cin.tie(0);
typedef long long ll;

ll n, k;
vector<ll> prime;

void INPUT()
{
    IAMFAST
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        ll p;
        cin >> p;
        prime.emplace_back(p);
    }
    cin >> k;
}

void solution()
{
    ll ans = 0;
    for (auto p : prime)
    {
        ll temp = p;
        while (p <= k)
        {
            ans += k / p;
            p *= temp;
        }
    }
    cout << ans;
}

int main()
{
    INPUT();
    solution();
}

🥇문제 후기


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM
post-custom-banner

0개의 댓글