반응형
문제 설명
algospot.com :: PASS486
비밀번호 486 문제 정보 문제 재훈이는 한 번 담배를 끊겠다고 다짐할 때마다 이메일 계정 비밀번호를 바꾸는 습관이 있습니다. 재훈이는 비밀번호를 항상 "no-smok**X**" 와 같이 정하는데, 여기서 X
www.algospot.com
- n개의 약수를 갖는 숫자 X를 비밀번호로 선택한다.(n < 400)
- 비밀번호는 lo~hi 범위 내의 숫자이다(양 끝의 수 포함)(1 <= lo <= hi <= 10,000,000)
=> lo ~ hi 범위 이내에 정확히 n개의 약수를 갖는 숫자의 개수를 출력하기
문제 풀이
약수의 개수 미리 구해두기
이 문제는 어떤 한 수가 가지는 약수의 개수를 구해야 한다.
그렇기 때문에 약수 개수를 미리 배열에 구해두고, 나중에 사용하면 한 숫자에 대해 두 번 계산하는 경우를 방지할 수 있다.
a가 b의 약수라는 것은 곧 b는 a의 배수라는 뜻이다.
그러므로 a의 배수인 모든 수에 약수의 개수를 +1 해주고, a+1의 배수, a+2의 배수, ... 를 거쳐가면서 약수의 개수를 전부 계산하면, 1 ~ 10,000,000의 모든 약수의 개수를 구할 수 있다.
그 후 lo와 hi사이에 포함되는 수 중 n개의 약수를 가진 숫자의 개수를 셌다.
문제 풀이 코드
#include <iostream>
#define MAXVALUE 10000000
using namespace std;
int divisorCnt[MAXVALUE + 1]; // 약수 개수 저장
void calDivisorCnt() { // 약수 배열 만들기
for (int i = 2; i <= MAXVALUE; ++i) {
for (int j = i; j <= MAXVALUE; j += i) {
++divisorCnt[j];
}
}
}
int main() {
fill_n(divisorCnt, MAXVALUE + 1, 1);
calDivisorCnt();
int C;
cin >> C;
for (int tc = 1; tc <= C; ++tc) {
int n, lo, hi;
int ans = 0;
cin >> n >> lo >> hi;
for (int i = lo; i <= hi; ++i) {
if (divisorCnt[i] == n)
++ans;
}
cout << ans << endl;
}
return 0;
}
반응형
'알고리즘 문제풀이 > 알고리즘 문제해결전략' 카테고리의 다른 글
16.4_졸업 학기_GRADUATION (0) | 2023.04.15 |
---|---|
14.6_마법의 약_POTION (0) | 2023.04.09 |
12.4_캐나다 여행_CANADATRIP (0) | 2023.04.06 |
13.3_승률올리기_RATIO (0) | 2023.04.04 |
11.7_카쿠로_KAKURO2 (2) | 2023.03.26 |