반응형
5213. 진수의 홀수 약수
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWT-hF8KdBADFAVT
범위가 1,000,000이라 그냥 구하면 시간초과.
[1]
미리 홀수약수의 합을 memo[]에 구해놓는다.
배수를 이용한다.
[2]
미리 홀수약수 합들을 구해놔도 범위를 많이주면 찾는데 오래걸린다.
부분합을 미리 구해놓는다.
검색해보니 인덱스트리를 이용하는 방법도 있던데, 그냥 부분합만 구해도 통과된다.
package com.company;
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static int NUM = 1000000;
public static void main(String[] args) {
//홀수인 약수 합을 미리 구해놓는다( 3의 배수는 모두 3을 약수로 가진다 -> 3,6,9,12,15... )
int[] memo = new int[NUM +1];
for(int i = 1; i<= NUM; i+=2){
for(int j = 1; j<= NUM/i; j++){
memo[i*j] += i;
}
}
//부분까지의 합을 미리 구해놓는다 S(n) = S(n-1) + a(n)
long[] sum = new long[NUM +1];
sum[1] = memo[1];
for(int i = 2; i<= NUM; i++){
sum[i] = sum[i-1] + memo[i];
}
//홀수합을 구한다
int T = sc.nextInt();
int a,b;
for(int i=1; i<=T; i++){
a = sc.nextInt();
b = sc.nextInt();
long result= sum[b] - sum[a-1];
System.out.println("#" + i + " " + result);
}
}//main
}
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
쇠막대기 자르기 (0) | 2018.09.10 |
---|---|
[BFS] 미로탐색 (0) | 2018.09.10 |
에라토스테네스의 체 (0) | 2018.09.10 |
[카카오예제] 1부터 n까지 중복확인 (0) | 2018.09.05 |
[DP] 스티커 (0) | 2018.08.29 |