| ps | |
|---|---|
| 링크 | acmicpc.net/… |
| 출처 | BOJ |
| 문제 번호 | 16563 |
| 문제명 | 어려운 소인수분해 |
| 레벨 | 골드 4 |
| 분류 |
정수론 |
| 시간복잡도 | O(n +mloglogn) |
| 인풋사이즈 | n<=5,000,000, m<=1,000,000 |
| 사용한 언어 | Python |
| 제출기록 | 327564KB / 3616ms |
| 최고기록 | 3616ms |
| 해결날짜 | 2022/05/28 |
"""Solution code for "BOJ 16563. 어려운 소인수분해".
- Problem link: https://www.acmicpc.net/problem/16563
- Solution link: http://www.teferi.net/ps/problems/boj/16563
Tags: [Number theory] [Linear sieve]
"""
def least_prime_factor(n):
lpf = list(range(n + 1))
lpf[2::2] = [2] * (n // 2)
primes = []
for i in range(3, n // 3 + 1, 2):
if lpf[i] == i:
primes.append(i)
for p in primes:
if i * p > n or p > lpf[i]:
break
lpf[i * p] = p
return lpf
def main():
N = int(input()) # pylint: disable=unused-variable
k = [int(x) for x in input().split()]
lpf = least_prime_factor(max(k))
for k_i in k:
answer = []
n = k_i
while n > 1:
p = lpf[n]
n //= p
answer.append(p)
print(*answer)
if __name__ == '__main__':
main()