[BOJ/C++] 1456 거의 소수

GamzaTori·2024년 8월 31일

Algorithm

목록 보기
45/133

에라토스테네스의 체 알고리즘을 이용하여 문제를 해결할 수 있습니다.

입력이 최대 10의 14승 이고 에라토스테네스의 체를 이용하면 제곱근까지만 수행하면 됩니다.

먼저 에라토스테네스의 체를 이용하여 소수를 구해줍니다

이후 모든 소수에 대해서 거듭제곱을 하며 B보다 작거나 같을때까지 A보다 크거나 같으면 count를 증가시킵니다.

// boj g5 1456
// 거의 소수
#include<iostream>
#include<vector>
#include<cmath>

using namespace std;

static vector<bool> v;

int main(void)
{
    ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

    long long A, B;
    cin >> A >> B;

    v.resize(sqrt(B)+1);

    v[1]=true;
    for(int i=2; i<=sqrt(B); i++)
    {
        for(int j=2; i*j<=sqrt(B); j++)
            v[i*j]=true;
    }
    
    int count=0;
    for(long long i=2; i<=sqrt(B); i++)
    {
        int k=2;
        if(!v[i])
        {
            while(pow(i,k)<=B)
            {
                if(pow(i,k)>=A)
                    count++;
                k++;
            }   
        }
    }


    cout << count;

    return 0;
}
profile
게임 개발 공부중입니다.

0개의 댓글