[백준] 1016번: 제곱 ㄴㄴ 수
2019. 7. 26. 19:05ㆍ알고리즘
1016번: 제곱 ㄴㄴ 수
첫째 줄에 min과 max가 주어진다. min은 1보다 크거나 같고, 1,000,000,000,000보다 작거나 같은 자연수이고, max는 min보다 크거나 같고, min+1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
문제
어떤 수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min과 max를 포함한 사이에 제곱ㄴㄴ수가 몇 개 있는지 출력한다.
입력
첫째 줄에 min과 max가 주어진다. min은 1보다 크거나 같고, 1,000,000,000,000보다 작거나 같은 자연수이고, max는 min보다 크거나 같고, min+1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 [min,max]구간에 제곱ㄴㄴ수가 몇 개인지 출력한다.
예제 입력 1 복사
1 10
예제 출력 1 복사
7
에라토스테네스의 체 문제가 익숙하다면, 문제를 보고 어 비슷한데, 라는 생각을 했을 것 같습니다.
제곱ㄴㄴ수의 규칙을 에라토스테네스의 체를 해결하는 방식에 접목시켜서 문제를 풀어나가면 되는데요.
이 문제가 조금 까다로운 것은, min과 max 값의 범위를 처리하는 부분일 것 같기도 합니다.
굉장히 큰 수이기 때문에 min, max의 범위를 0부터 max - min 값으로 대치시켜 생각하여 문제를 해결했습니다.
#include <iostream>
using namespace std;
bool sieve[1000001];
int main() {
long long m, M;
cin >> m >> M;
long long ans = M - m + 1;
for (long long i = 2; i * i <= M; i++) {
long long start = m % (i * i) == 0 ? 0 : i * i - (m % (i * i));
for (long long j = start; j <= M - m; j += i * i) {
if (!sieve[j]) {
ans -= 1;
sieve[j] = true;
}
}
}
cout << ans << '\n';
return 0;
}
'알고리즘' 카테고리의 다른 글
[백준] 11493번: 이항 계수 5 (0) | 2019.08.02 |
---|---|
[백준] 10830번: 행렬 제곱 (0) | 2019.07.26 |
[백준] 1629번: 곱셈 (0) | 2019.07.26 |
[백준] 1495번: 기타리스트 (0) | 2019.07.12 |
[백준] 1720번: 타일 코드 (0) | 2019.07.12 |