Suhwanc

문제 링크 : https://www.acmicpc.net/problem/17425

 

17425번: 약수의 합

두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다. 자연수 N이 주어졌을 때, g(N)을 구해보자.

www.acmicpc.net

 

문제

두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더한 값이고, f(A)로 표현한다. x보다 작거나 같은 모든 자연수 y의 f(y)값을 더한 값은 g(x)로 표현한다.

자연수 N이 주어졌을 때, g(N)을 구해보자.

 

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 100,000)가 주어진다. 둘째 줄부터 테스트 케이스가 한 줄에 하나씩 주어지며 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

 

출력

각각의 테스트 케이스마다, 한 줄에 하나씩 g(N)를 출력한다.

 

 

풀이

17427번 약수의 합 문제는 https://suhwanc.tistory.com/55 이 포스트를 참고하세요!

이 문제도 전에 올린 17427번 약수의 합 문제와 99% 일치하는 문제이다.

다만, g(n)들을 사전에 미리 구해 놓는 작업이 필요할 뿐이다.

 

 

소스 코드

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
#define MAX 1000000
#include <iostream>
#include <vector>
using namespace std;
 
 
vector<long long> d(MAX + 1);
int main()
{
    int t; scanf("%d"&t);
    vector<long long> f(MAX + 11);
    for (int i = 2; i <= MAX; i++) {
        for (int j = 1; i * j <= MAX; j++) {
            f[i * j] += i;
        }
    }
    for (int i = 1; i <= MAX; i++) {
        d[i] = d[i - 1+ f[i];
    }
    while (t--) {
        int n; scanf("%d"&n);
        printf("%lld\n", d[n]);
    }
    return 0;
}
cs

개발환경 : Visual Studio 2019

지적, 조언 언제든지 환영입니다~~

'백준 문제풀이' 카테고리의 다른 글

백준 17298번 오큰수  (0) 2020.01.16
백준 16194번 카드 구매하기 2  (0) 2020.01.14
백준 17427번 약수의 합 2  (2) 2020.01.14
백준 4375번 1  (0) 2020.01.14
백준 2504번 괄호의 값  (0) 2020.01.08