※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2904번 문제인 수학은 너무 쉬워이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2904
2904번: 수학은 너무 쉬워
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100) 둘째 줄에는 종이에 적혀있는 수 N개가 주어진다. 수는 모두 1,000,000보다 작거나 같은 양의 정수이다.
www.acmicpc.net
주어진 총 N개의 수를 이루는 각 소인수가 총 몇 개씩 있는지를 구하고, 이를 균일하게 분배하는 것으로 "가장 높은 점수"를 구할 수 있다.
이러한 "가장 높은 점수"를 만들기 위해, 각 칸마다 "부족한 소인수"를 어딘가에 있을 남는 소인수를 옮겨오면(그 수에서 해당 소인수를 나누고 소인수가 부족한 수에 곱하면) 되므로, 각 N개의 수마다 "가장 높은 점수"의 배수가 되기 위해 필요한 소수의 개수를 구해 더한 것이 "가장 높은 점수"를 얻기 위해 필요한 최소 행동 횟수가 된다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
bool sieve[1000000];
vector<int> primes;
int num[100];
int cnt[1000000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
sieve[0] = sieve[1] = 1;
for (ll i = 2; i < 1000000; i++) {
if (sieve[i]) continue;
primes.push_back(i);
for (ll j = i * i; j <= 1000000; j += i) {
sieve[j] = 1;
}
}
int N; cin >> N;
for (int i = 0; i < N; i++) {
int x; cin >> x;
num[i] = x;
int idx = 0;
while (x > 1) {
if (x % primes[idx] == 0) {
x /= primes[idx];
cnt[primes[idx]]++;
}
else idx++;
}
}
int ans = 1;
for (int i = 2; i < 1000000; i++) {
int temp = cnt[i] / N;
while (temp--) {
ans *= i;
}
}
cout << ans << ' ';
int anscnt = 0;
for (int i = 0; i < N; i++) {
int x = num[i], y = ans;
int idx = 0;
while (y > 1) {
if (y % primes[idx] == 0) {
y /= primes[idx];
if (x % primes[idx] != 0) anscnt++;
else x /= primes[idx];
}
else idx++;
}
}
cout << anscnt;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2623 // C++] 음악프로그램 (0) | 2021.09.01 |
---|---|
[BOJ 12924 // C++] 멋진 숫자 쌍 (0) | 2021.08.31 |
[BOJ 1193 // C++] 분수찾기 (0) | 2021.08.29 |
[BOJ 11729 // C++] 하노이 탑 이동 순서 (0) | 2021.08.28 |
[BOJ 17394 // C++] 핑거 스냅 (0) | 2021.08.27 |