이 문제에서는 여러 쿼리에 대해 Sieve O(log n)를 사용하여 소인수분해를 계산하는 프로그램을 만들어야 합니다.
일반적인 방법은 O(sqrt(n) ) 시간이 걸리므로 여러 쿼리에서 필요한 시간이 엄청나게 늘어납니다.
먼저 요약하자면
소인수 분해 의 숫자에는 소인수만 포함되며 소인수의 곱은 포함되지 않습니다.
에라토스테네스의 체 주어진 범위 내에서 모든 소수를 생성하는 알고리즘입니다.
솔루션 접근 방식
문제의 해는 수를 나누는 가장 작은 인수를 찾아 인수로 저장하고 인수로 나누어 수를 갱신함으로써 구합니다. 이 과정은 나눗셈 후 숫자가 1이 될 때까지 재귀적으로 수행되므로 다른 요소가 불가능합니다.
계산은 에라토스테네스 체 를 사용하여 수행됩니다. 이는 가장 작은 소인수를 찾는 시간 복잡성을 줄입니다.
우리 솔루션의 작동을 설명하는 프로그램
예시
#include <iostream> using namespace std; int primes[100001]; void sieveOfEratosthenes(int N) { N+=2; primes[1] = 1; for (int i=2; i<N; i++) primes[i] = i; for (int i=4; i<N; i+=2) primes[i] = 2; for (int i=3; i*i<N; i++) { if (primes[i] == i) { for (int j=i*i; j<N; j+=i) if (primes[j]==j) primes[j] = i; } } } void findPrimeFactors(int num) { sieveOfEratosthenes(num); int factor; while (num != 1) { factor = primes[num]; cout<<factor<<" "; num /= factor; } } int main() { int N = 45214; cout<<"Prime factorization of the number "<<N<<" using sieve is "; findPrimeFactors(N); return 0; }
출력
Prime factorization of the number 45214 using sieve is 2 13 37 47