반응형
https://www.acmicpc.net/problem/16563
16563번: 어려운 소인수분해
첫째 줄에는 자연수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 자연수 ki (2 ≤ ki ≤ 5,000,000, 1 ≤ i ≤ N)가 N개 주어진다.
www.acmicpc.net
1.문제설명
에라토스테네스의 체를 이용하여 소인수분해를 해야하는 문제이다.
빠른 소인수분해를 위해 에라토스테네스의 체를 이용해서
단순히 소수를 판별하는 것을 넘어서
Prime[x] = y , x의 소인수 중 가장 작은 소수 y값을 저장하면
이를 바탕으로 소인수분해를 빠르게 할 수 있다.
예를 들어 10을 소인수 분해 할 때
Prime 배열은 다음과 같다
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
-1 | 2 | 3 | 2 | 5 | 2 | 7 | 2 | 3 | 2 |
int x = 10 이라고 하면
Prime[x] == 2 이므로
2를 출력하고 x = x/2를 해준다
그러면 Prime[x] =5 이므로
5를 출력하고 x = x/5
x==1 이므로 종료한다.
이런식으로 에라토스테네스체를 이용하여 빠른 소인수분해를 할 수 있다.
2.문제풀이코드
#include <bits/stdc++.h>
using namespace std;
#define LEN 5000001
//Fast Factorization
int Prime[LEN];
//O(nloglogn)
void erathostenes(){
Prime[0] = Prime[1] = -1;
for(int i=2; i<LEN; i++){
Prime[i] = i;
}
int sqrtn = int(sqrt(LEN));
for(int i=2; i<=sqrtn; i++){
for(int j=i*i; j<LEN; j+=i){
if(Prime[j] == j){
Prime[j] = i;
}
}
}
}
//아마도 O(n) 이하
void Factorization(int num){
while(num > 1){
cout << Prime[num] << ' ';
num /= Prime[num];
}
cout << '\n';
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int t;
cin >> t;
erathostenes();
for(int T=0;T<t; T++){
int num;
cin >> num;
Factorization(num);
}
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 1600번 : 말이 되고픈 원숭이 - 상태 추가 BFS (0) | 2022.07.02 |
---|---|
백준 1325번 : 효율적인 해킹 -BFS, DP를 쓰면 안되는 이유 C++ (0) | 2022.07.02 |
백준 2470번 : 두 용액 - 투포인터 (0) | 2022.06.29 |
[백준] 2401 - 최대 문자열 붙여넣기 KMP + DP Cpp 코드 (0) | 2022.06.27 |
[백준] 4354번 : 문자열 제곱 - 자세한 설명 포함 KMP 알고리즘 응용 (0) | 2022.06.25 |