Dolphins의 HelloWorld
SW Expert Academy 5213. 진수의 홀수 약수 D4 본문
문제링크 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWT-hF8KdBADFAVT&categoryId=AWT-hF8KdBADFAVT&categoryType=CODE
이 문제에서 가장 중요한건 다름이 아니라
문제의 조건인 100000개 테스트케이스를 합쳐서 5초이내에 계산이 돼야된다는 점이다.
고로 주어지는 숫자 n까지의 홀수 약수의 합을 미리 구해 저장해놓은다음
문제에서 L과R을 제시하면 저장해놓은 memo 배열에서
memo[R] - memo[L-1]을 해서 바로 숫자가 나올 수 있도록 해야한다.
이렇게 하면 미리 memo배열에 숫자를 넣는 과정에는 약간의 시간이 걸리지만
그 후에는 아주 근소한 시간밖에 걸리지 않으므로 문제를 풀 수 있다.
#include <iostream> #include <cmath> #define num 1000000 long long memo[1000001]; using namespace std; void function() { for (int k = 2; k <= 1000000; k++) { long long result = 0; int last = (int)sqrt(k); for (int i = 1; i <= last; i++) { if (k % i == 0) { if (i % 2 == 1) result += i; long long num2 = k / i; if (num2 == i) break; else if (num2 % 2 == 1) result += num2; } } memo[k] = memo[k - 1] + result; } } int main() { long long ans; int count = 0; int testcase; scanf("%d", &testcase); memo[1] = 1; function(); while (testcase--) { ans = 0; int L, R; scanf("%d %d", &L, &R); printf("#%d %lld\n", ++count, memo[R] - memo[L - 1]); } }
'Algorithm > SW Expert Academy' 카테고리의 다른 글
SW Expert Academy 5432.쇠막대기 자르기 D4 (0) | 2018.09.01 |
---|---|
SW Expert Academy 4796. 의석이의 우뚝 선 산 D4 (0) | 2018.08.21 |
SW Expert Academy 4789. 성공적인 공연 기획 D3 (0) | 2018.08.20 |
SW Expert Academy 1859. 백만장자 프로젝트 D2 (0) | 2018.08.19 |
Comments