728x90
반응형

1456번: 거의 소수
문제
https://www.acmicpc.net/problem/1456
1456번: 거의 소수
어떤 수가 소수의 N제곱(N ≥ 2) 꼴일 때, 그 수를 거의 소수라고 한다. 두 정수 A와 B가 주어지면, A보다 크거나 같고, B보다 작거나 같은 거의 소수가 몇 개인지 출력한다.
www.acmicpc.net
풀이
거의 소수는 소수의 N제곱 형태인 수를 말한다. 범위 내 거의 소수의 개수를 구하는 문제다.
수의 범위가 10^14이고 N제곱 형태를 구하므로 에라토스테네스의 체를 사용해 10^7까지의 소수만 구해준다. 소수를 i라고 한다면 i^2 = i × i부터 범위에 포함된다면 카운트를 증가시켜 주면 된다.
단, 범위 판단에 주의해야한다. 현재 수의 +1승이 범위 내인지 확인하려면 (현재수 × i)가 B보다 작아야 한다. 하지만 곱셈은 N제곱하다 보면 long long 범위에 벗어나 overflow가 날 수 있기 때문에 (현재수가 B ÷ i보다 작을 때)로 기준을 잡아줘야 한다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
vector<int> sieve(10000001, 1), prime;
for (int i = 2; i <= 10000000; i++)
if (sieve[i]) {
prime.push_back(i);
for (int j = i * 2; j <= 10000000; j += i)
sieve[j] = 0;
}
long long a, b, ans = 0;
cin >> a >> b;
for (int i : prime) {
long long tmp = i;
while (tmp <= b / i) {
tmp *= i;
if (tmp >= a)
ans++;
}
}
cout << ans << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 1543 문서 검색 (0) | 2023.03.04 |
---|---|
[백준 / BOJ] C++ 1463 1로 만들기 (0) | 2023.03.04 |
[백준 / BOJ] C++ 1436 영화감독 숌 (0) | 2023.03.04 |
[백준 / BOJ] C++ 27648 증가 배열 만들기 (0) | 2023.03.04 |
[백준 / BOJ] C++ 12020 LU 분해 (0) | 2023.03.04 |