문제 링크입니다: https://www.acmicpc.net/problem/1816
1816번: 암호 키
현대 사회에서 통용되고 있는 많은 종류의 암호 시스템에서는, 매우 큰 소수의 곱으로 만들어진 수를 암호 키로 이용하는 경우가 많다. 현실적으로 매우 큰 수를 빠른 시간 내에 소인수분해하는 것은 어려운 일이기 때문이다. 물론 실제 생활에서는 수십만 또는 수백만 자리 이상의 매우 큰 소수가 활용되지만 그러한 소수를 구하는 것은 매우 어려운 일이므로, 우리는 좀 더 스케일이 작은 경우에 대해서만 생각해 보기로 하자. 1,000,000=10^6보다 큰 소수이면
www.acmicpc.net
에라토스테네스의 체를 이용하여 소수를 구하고
S가 그 소수들에 의하여 나누어 떨어지지 않는지를 판별하는 문제였습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
const int MAX = 1e6 + 1; | |
int minFactor[MAX]; | |
vector<int> prime; | |
void eratosthenes(void) | |
{ | |
minFactor[0] = minFactor[1] = -1; | |
for (int i = 2; i < MAX; i++) | |
{ | |
minFactor[i] = i; | |
} | |
for (int i = 2; i*i < MAX; i++) | |
{ | |
if (minFactor[i] == i) | |
{ | |
for (int j = i * i; j < MAX; j += i) | |
{ | |
if (minFactor[j] == j) | |
{ | |
minFactor[j] = i; | |
} | |
} | |
} | |
} | |
for (int i = 2; i < MAX; i++) | |
{ | |
if (minFactor[i] == i) | |
{ | |
prime.push_back(i); | |
} | |
} | |
} | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int N; | |
cin >> N; | |
eratosthenes(); | |
for (int n = 0; n < N; n++) | |
{ | |
long long S; | |
cin >> S; | |
bool flag = true; | |
for (int i = 0; i < prime.size(); i++) | |
{ | |
if (S%prime[i] == 0) | |
{ | |
flag = false; | |
break; | |
} | |
} | |
if (flag) | |
{ | |
cout << "YES\n"; | |
} | |
else | |
{ | |
cout << "NO\n"; | |
} | |
} | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1526번 가장 큰 금민수 (1) | 2020.01.30 |
---|---|
백준 15596번 정수 N개의 합 (0) | 2020.01.30 |
백준 3671번 산업 스파이의 편지 (0) | 2019.11.24 |
백준 2355번 시그마 (0) | 2019.11.11 |
백준 9506번 약수들의 합 (0) | 2019.11.11 |