[BOJ 1016] 제곱 ㄴㄴ 수

2024. 11. 22. 17:01Baekjoon

728x90

- 문제 요약

 

어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다

min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다.

(1 <= min 1,000,000,000,000 / min <= max <= min + 1,000,000)

 

 

- 알고리즘 정리

 

문제에서 제공한 min의 범위를 확인해보면, 최대 1조까지라는 것을 확인할 수 있습니다.

그러므로 단순히 반복문을 돌기만 하면, 제한시간 내에 문제를 해결할 수 없습니다.

 

min <= max <= min + 1,000,000

문제에서는 min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수를 구하라고 했습니다.

위 조건을 보고 다시 문제를 읽어보면, 봐야할 범위는 100만이라는 것을 알 수 있습니다. (눈속임.)

 

그러므로 위 사실과 에라토스테네스의 체를 이용해서 조건에 맞는 수를 구해주면 됩니다.

(수 저장용 배열도 하나 만들어줍니다.)

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 1000001
typedef long long ll;
ll mn,mx,result,arr[MAX];

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>mn>>mx;
	for(ll i=2;i*i<=mx;i++){
		ll w=mn/(i*i);
		if(mn%(i*i)){
			w++;	
		}
		while(i*i*w<=mx){
			arr[i*i*w-mn]=1;
			w++;
		}
	}
	for(int i=0;i<=mx-mn;i++){
		if(arr[i]==0){
			result++;
		}
	}
	cout<<result;
}

코드 제출 결과

 

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 4811] 알약  (0) 2024.12.05
[BOJ 2229] 조 짜기  (0) 2024.12.04
[BOJ 19951] 태상이의 훈련소 생활  (1) 2024.11.21
[BOJ 10453] 문자열 변환  (1) 2024.11.19
[BOJ 4563] 리벤지 오브 피타고라스  (0) 2024.11.19