728x90
반응형

17425번: 약수의 합
문제
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의 모든 약수를 더
www.acmicpc.net
풀이
예전에 모든 수의 약수의 합을 에라토스테네스의 체를 사용해 구하는 법을 9213번 문제를 통해 만들어봤다. [9213 꽤 좋은 수 해설] 링크를 참고해 주길. 어떤 수 A은 A의 배수의 약수다. 범위 내 모든 A의 배수에 A을 더해준다. 그러면 sieve의 A번 인덱스에는 A의 모든 약수의 합을 값으로 가진다. 즉, sieve의 각 인덱스 값은 f(A)이다.
우리가 원하는 값은 g(N)이다. g(N)은 1~N의 모든 f(A)의 값의 합이다. 따라서 dp 배열을 만들어주고 점화식을 구하면 dp[i] = dp[i-1] + sieve[i]다. 미리 모두 구한 다음 각 테스트 케이스에 대해 dp[N]을 출력한다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
vector<long long> sieve(1000001, 0), dp(1000001, 0);
for (int i = 1; i <= 1000000; i++)
for (int j = i; j <= 1000000; j += i)
sieve[j] += i;
for (int i = 1; i <= 1000000; i++)
dp[i] = dp[i - 1] + sieve[i];
int t, n;
cin >> t;
while (t--) {
cin >> n;
cout << dp[n] << '\n';
}
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 27889 특별한 학교 이름 (0) | 2023.03.27 |
---|---|
[백준 / BOJ] C++ 13975 파일 합치기 3 (0) | 2023.03.26 |
[백준 / BOJ] C++ 1197 최소 스패닝 트리 (14) | 2023.03.25 |
[백준 / BOJ] C++ 3803 Networking (10) | 2023.03.25 |
[백준 / BOJ] C++ 23034 조별과제 멈춰! (0) | 2023.03.25 |