티스토리 뷰
주어진 범위의 수들 중 k개의 등차수열의 합으로 표현가능한 수의 수를 구하는 문제다.
초항과 공차가 반드시 자연수이므로 각 k에 맞는 최소한의 수가 존재한다.
k = 2)
1 + 2 = 3이므로, left가 3보다 작더라도 3부터 시작한다.
초항 n, 공차 d에서 n + n + d = 2n + d를 만족하는 모든 수가 해당된다.
따라서 3이상의 모든 수가 길이가 2인 등차수열의 합이다. (예: 4 = 1 + 3, 5 = 1 + 4 ...)
k = 3)
1 + 2 + 3 = 6이므로, left가 6보다 작더라도 6부터 시작한다.
초항 n, 공차 d에서 n + n + d + n + 2d = 3n + 3d를 만족하는 모든 수가 해당된다.
따라서 6이상의 모든 3의 배수가 길이가 3인 등차수열의 합이다.
k = 4)
1 + 2 + 3 + 4 = 10이므로, left가 10보다 작더라도 10부터 시작한다.
초항 n, 공차 d에서 n + n + d + n + 2d + n + 3d = 4n + 6d를 만족하는 모든 수가 해당된다.
수는 10이상의 짝수여야하고, 12는 길이가 4인 등차수열의 합으로 표현할 수 없다.
따라서 10이상의 12가 아닌 모든 짝수가 길이가 4인 등차수열의 합이다.
k = 5)
1 + 2 + 3 + 4 + 5 = 15이므로, left가 15보다 작더라도 15부터 시작한다.
초항 n, 공차 d에서 n + n + d + n + 2d + n + 3d + n + 4d = 5n + 10d를 만족하는 모든 수가 해당된다.
따라서 15이상의 모든 5의 배수가 길이가 5인 등차수열의 합이다.
문제에서 범위는 최대 10억을 넘지 않으므로, 모두 left(또는 각 k에 맞는 최솟값)부터 right까지 naive한 반복을 돌려도 시간 안에 풀 수 있다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() {
val writer = BufferedWriter(OutputStreamWriter(System.out))
val reader = BufferedReader(InputStreamReader(System.`in`))
val left = reader.readLine().toInt()
val right = reader.readLine().toInt()
val count = when (reader.readLine().toInt()) {
2 -> maxOf(right - maxOf(left, 3) + 1, 0)
3 -> {
var count = 0
val min = maxOf(left, 6)
for (i in min .. right) {
if (i % 3 == 0) {
count++
}
}
count
}
4 -> {
var count = 0
val min = maxOf(left, 10)
for (i in min .. right) {
if (i and 1 == 0 && i != 12) {
count++
}
}
count
}
5 -> {
var count = 0
val min = maxOf(left, 15)
for (i in min..right) {
if (i % 5 == 0) {
count++
}
}
count
}
else -> throw AssertionError("k range error")
}
writer.write("$count\n")
writer.flush()
return
}
'간단 문제 풀이' 카테고리의 다른 글
백준 1292: 쉽게 푸는 문제 (0) | 2022.02.21 |
---|---|
백준 9464: 직사각형 집합 (0) | 2021.10.06 |
백준 15711: 환상의 짝꿍 (0) | 2021.09.30 |
[C 터렛] 백준 1002 (0) | 2018.01.21 |
[C 알고리즘] 그놈에 다이아몬드 찍기 (0) | 2018.01.11 |
- Total
- Today
- Yesterday
- CM10.2
- d802
- dokdo project
- PipelineContext
- 포인터
- inline class
- dokdo 4.0.3
- 객체지향
- g2 korea
- C++
- dokdo-project
- c++ 상속
- rule_of_three
- cyanogenmod
- LG
- c++ struct
- c++11
- C
- C++ 업캐스팅
- OOP
- nodeal
- f320k
- Java
- G2
- CM11
- linaro
- f320s
- Kotlin
- rule_of_five
- vector
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |