Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
codeforces _ 230B _ B. T-primes 본문
https://codeforces.com/problemset/problem/230/B
조건
2초, n (1 ≤ n ≤ 10^5), xi (1 ≤ xi ≤ 10^12)
접근
이 문제는 약수가 3개인 수를 구한다.
약수가 3개인 수가 뭘까?
잘 생각해보면 소수를 ^2하면 약수가 3개인 수를 구할수 있음을 깨달을 수 있다.
ex) 소수 2, 3, 5, 7의 제곱수들을 보면 4, 9, 25, 49로 모두 약수가 3개인 수들이다.
그렇다면 소수만 빨리 풀수 있다면 이 문제도 시간내에 충분히 풀수있을것이다.
풀이방법
일단 범위는 루트를 씌워 구할것이기 때문에 10^12의 루트를 씌운 10^6 + 1로 설정했다.
그외에는 그냥 에라스토테네스의 체로 소수 판별 배열을 미리 만들고, 입력받은 수가 루트로 나누어 떨어지며 또한, 그 루트를 씌운수가 소수인지 아닌지에 따라 yes or no를 구분했다.
전체코드
#include <iostream>
#define MAXP 1000000
using namespace std;
bool isPrime[MAXP+1];
void checkPrime()
{
memset(isPrime, true, MAXP);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= sqrt(MAXP)+1; i++)
{
if (isPrime[i] == true)
{
for (int j = i * 2; j <= MAXP; j += i)
isPrime[j] = false;
}
}
}
void InputAndSolve()
{
int n;
cin >> n;
long long value;
for (int i = 0; i < n; i++)
{
cin >> value;
long long sqrtValue = sqrt(value);
bool isPossible = false;
if (value == pow(sqrtValue, 2))
{
if (isPrime[sqrtValue] == true)
isPossible = true;
}
if (isPossible == true)
cout << "YES" << '\n';
else
cout << "NO" << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
checkPrime();
InputAndSolve();
return 0;
}
후기
굿
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
알고스팟 _ LIS, 백준 12015번 _가장 긴 증가하는 부분 수열 2 (0) | 2020.05.08 |
---|---|
알고스팟 _ 삼각형 위의 최대 경로 (0) | 2020.05.08 |
백준 1700번 _ 멀티탭 스케줄링 (0) | 2020.05.07 |
백준 11000번 _ 강의실 배정 (0) | 2020.05.07 |
백준 4796, 1449, 17509 _ 그리디 알고리즘 (0) | 2020.05.07 |
Comments