티스토리 뷰
문제 링크
https://algospot.com/judge/problem/read/PASS486
약수 n개를 가지고있는 숫자를 범위 low부터 high까지의 숫자들 중에서 찾아내는 문제입니다.
정수 x의 약수의 개수는 x 이전의 모든 값에 대한 약수의 개수와 가장 작은 소인수 값을 알고있으면 찾을 수 있습니다.
예를 들어 12의 약수의 개수를 알고싶고 1부터 11까지의 약수의 개수와 12를 포함한 모든 값들의 가장 작은 소인수를 알고 있습니다.
그럼 12를 12의 가장 작은 소인수인 2로 나누면 6이 됩니다.
12를 n, 6을 p라고 하고
n과 p의 가장 작은 소인수는 2로 같습니다.
이렇게 n과 p의 가장 작은 소인수가 같은 경우 p의 가장 작은 소인수의 개수를 확인합니다.
p의 가장 작은 소인수의 개수 2는 1개 입니다.
그럼 n은 p에서 공통으로 가장 작은 소인수인 2를 한번 더 곱한 값이기 때문에 n에서의 가장 작은 소인수인 2의 개수는 2개라고 할 수 있습니다.
이 값을 a라고 했을 때
다음과 같은 식으로 n의 약수의 개수를 구할 수 있습니다.
만약 n과 p의 가장 작은 소인수가 서로 다른 경우
예를 들어 6은 6의 가장 작은 소인수가 2인데 6을 2로 나눈 3의 가장 작은 소인수는 3으로 서로 다릅니다.
그러면 6의 소인수에는 2가 1개밖에 존재하지 않기 때문에 factors[3]에 2를 곱해주면 6의 약수의 개수를 구할 수 있습니다. 그러므로 a를 1로 두면 위의 식과 동일하게 적용할 수 있습니다.
이렇게 소인수의 개수를 먼저 구하는 방식으로 문제를 해결하기 위해서는 에라토스테네스의 체 알고리즘을 사용하여 1부터 주어진 최대값인 1천만 까지 각 수의 가장 작은 소인수를 먼저 구해주면 됩니다.
구현 코드
'Coding Test > 알고스팟' 카테고리의 다른 글
[C++] 알고스팟/완전탐색 - 게임판 덮기 (0) | 2020.01.11 |
---|---|
[C++] 알고스팟/완전탐색 - 소풍 (0) | 2020.01.10 |
[C++] 알고스팟/유클리드 - 마법의 약 (0) | 2020.01.08 |
[C++] 알고스팟/삼분검색 - 꽃가루 화석 (0) | 2020.01.05 |
[C++] 알고스팟/이분법 - 승률 올리기 (0) | 2020.01.05 |
- Total
- Today
- Yesterday
- import
- 종만북
- 알고스팟
- HiveQL
- 삼각형 위의 최대 경로
- 완전탐색
- Django
- 팰린드롬 구하기
- Jaeha's Safe
- 분할정복
- 출전 순서 정하기
- 하이브
- microwaving lunch boxes
- 배열과 문자열
- 합친 lis
- 2225
- 백준
- hive
- 하둡
- 삼각형 위의 최대 경로 수 세기
- python
- 두니발 박사의 탈옥
- pyspark
- Sqoop
- Hadoop
- 코딩인터뷰 완전분석
- 스파크
- 외발 뛰기
- HDFS
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |