본문 바로가기

알고리즘/SW EXPERT

5213. 진수의 홀수 약수

5213. 진수의 홀수 약수


숫자의 범위가 커서 시간제한이 문제일 것 같았다.


따라서 testcase 를 받기전에 get_f 함수를 통해서 각각의 f[x] 값들을 미리 구해주었다.


그리고 조금 더 시간을 단축하기 위해서 sum 이라는 배열을 통해서 sum[x] 는 1~X 까지 f[X] 의 합을 구했다.


따라서 정답을 구할 때는 sum[R]-sum[L-1] 을 통해서 구할 수 있었다.


get_f 에서 최대 루트 1000000 까지 돌고, main 함수에서 1000000 번 돌기 때문에 1억번으로 시간제한을 통과할 것이라고 생각하고 코드를 


구현하였다.


<정답 코드>


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
 
#define MAX 1000001
using namespace std;
 
long long f[MAX];
long long sum[MAX];
void get_f(int X)
{
    for (int i = 1; i*<= X; i++)
    {
        if (X%i == 0)
        {
            if (i % 2 == 1)
                f[X] += i;
 
            if (i != (X / i)) {
                if ((X / i) % 2 == 1)
                    f[X] += (X / i);
            }
        }
    }
}
 
int main()
{
 
    for (int i = 1; i < MAX; i++)
    {
        get_f(i);
        sum[i] += (sum[i - 1+ f[i]);
    }
 
    int tc;
    cin >> tc;
    for (int t = 1; t <= tc; t++)
    {
        int L, R;
        long long ans = 0;
        cin >> L >> R;
 
        cout << "#" << t << " " << sum[R]-sum[L-1<< endl;
 
    }
    return 0;
}
cs


반응형

'알고리즘 > SW EXPERT' 카테고리의 다른 글

5644. 무선충전  (0) 2018.10.01
1247.최적경로  (0) 2018.09.05
1248. 공통 조상  (0) 2018.09.04
5170. 상원이의 직선 긋기 게임  (0) 2018.08.03
4676. 늘어지는 소리 만들기  (0) 2018.08.02