우선 문제부터 이해해보자.
이고, 인 경우를 예로 들어 생각하면 아래와 같다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 0 + 0 = 0
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 1 + 0 = 1
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 0 + 1 = 1
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 2 + 0 = 2
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 0 + 0 = 0
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 1 + 1 = 2
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 0 + 0 = 0
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 3 + 0 = 3
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 0 + 2 = 2
이다.
일 때, 가 양의 정수를 만족하는 의 최댓값은 1 + 0 = 1
이다.
따라서 최댓값의 합인 가 되어야 한다.
부터 생각해보자.
로 나누어 떨어지는 는 이다.
로 나누어 떨어지는 는 이 되고,
이는 로 나누어 떨어지는 수를 로 한 번 더 나눌 수 있는 수와 같다.
위에 근거하여 표를 작성하면 아래와 같다.
즉, 각 가능한 모든 소인수에 대하여 나누어 떨어지는 수의 합이 출력 답안이 된다.
void solution()
{
ll ans = 0;
for (auto p : prime)
{
ll temp = p;
while (p <= k)
{
ans += k / p;
p *= temp;
}
}
cout << ans;
}
모든 소인수에 대하여, 해당 소인수로 나누어 떨어지는 의 갯수를 구하여
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();
}