본문 바로가기
알고리즘/백준

백준 1456 거의 소수 C++

by ash9river 2025. 1. 8.

간단한 해설

 

A와 B사이의 소수의 제곱수들을 구하면 된다.

 

이 때, A와 B가 10^14승까지 될 수 있어서 별 생각 없이 코드를 작성하다 보면 long long형의 범위를 초과할 수 있다.

 

1부터 10^14 사이의 제곱수들을 파악하면 되는 것이므로, 10^7까지의 소수만 계산하면 된다.[sqrt(10^14)]

 

그런데, 막상 A와 B 사이의 제곱수들을 파악할 때도 오버플로우가 발생할 수 있다.

 

다음과 같은 반례가 존재한다.

입력
1 100000000000000

출력
670121

 

현재 제곱수 값 x 소수 가 overflow될 수 있는 가능성이 있기에,

B / 현재 제곱수 값 < 소수 이면 반복문을 탈출하도록 overflow를 없애는 방향으로 가면 된다.

 

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#define ll long long
using namespace std;
vector<bool> isPrime;
int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	ll a,b;
	cin>>a>>b;
	isPrime.resize(10000001LL,true);
	isPrime[0]=isPrime[1]=false;
	for(ll i=2;i<=10000000LL;++i){
		if(isPrime[i]){
			for(ll j=i*i;j<=10000000LL;j+=i){
				isPrime[j]=false;
			}
		}
	}
	ll ans=0;
	for(ll i=2;i<=min(10000000LL,b);++i){
		if(isPrime[i]){
			for(ll j=i*i;j<=b;j*=i){
				if(j<a) continue;
				++ans;
				if(b/j<i) break;
			}
		}
	}
	cout<<ans;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 2636 치즈 C++  (0) 2025.01.09
백준 2141 우체국 C++  (0) 2025.01.09
백준 17835 면접보는 승법이네 C++  (0) 2024.12.18
백준 5052 전화번호 목록 C++  (0) 2024.12.11
백준 7490 0 만들기 C++  (0) 2024.11.29