백준 1016 제곱 ㄴㄴ수

2023. 9. 10. 22:59알고리즘문제 풀이/백준

문제

어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 제곱ㄴㄴ수가 몇 개 있는지 출력한다.

입력

첫째 줄에 두 정수 min과 max가 주어진다.

출력

첫째 줄에 min보다 크거나 같고, max보다 작거나 제곱ㄴㄴ수의 개수를 출력한다.

 

풀이

에라토스테네스의 체를 이용해서 구한다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>

using namespace std;

int main() {

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	long long min, max;
	cin >> min >> max;

	long long ans = max - min + 1; 

	//use the sieve of Eratosthenes
	vector<bool> sieve(max - min + 1, false);

	for (long long i = 2; i * i <= max; i++) {
		long long sNum = min / (i * i);
		if (min % (i * i) != 0)
			sNum += 1;

		while (sNum * (i * i) <= max) {
			if (sieve[sNum * (i * i) - min] == false) {
				sieve[sNum * (i * i) - min] = true;
				ans -= 1;
			}
			sNum += 1;
		}
	}

	cout << ans;
	return 0;
};

 

 

'알고리즘문제 풀이 > 백준' 카테고리의 다른 글

백준 1065 한수 C++  (0) 2023.09.11
백준 1018 체스판 다시 칠하기 C++  (0) 2023.09.11
백준 1012 유기능 배추 C++  (0) 2023.09.09
백준 1010 다리 놓기 Python  (0) 2023.09.08
백준 1008 A/B Python  (0) 2023.09.07