https://coderun.yandex.ru/problem/sum-of-numbers/description | Легкая |
---|
Вася очень любит везде искать своё счастливое число K
. Каждый день он ходит в школу по улице, вдоль которой припарковано N
машин. Он заинтересовался вопросом, сколько существует отрезков из подряд идущих машин таких, что сумма их номеров равна K
. Помогите Васе узнать ответ на его вопрос.
Ввод:
5 17 17 7 10 7 10Вывод:
4
Ввод:
5 10 1 2 3 4 1Вывод:
2
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
// Читаем количество элементов в массиве (n) и целевую сумму (k)
val (n, k) = reader.readLine().split(" ").map { it.toInt() }
// Читаем массив чисел
val arr = reader.readLine().split(" ").map { it.toInt() }
var currentSum = 0L // Текущая сумма префикса
var count = 0 // Количество подмассивов с суммой k
val prefixSumCount = mutableMapOf<Long, Int>() // Хранение количества встреченных сумм префиксов
prefixSumCount[0L] = 1 // Начальная сумма 0 встречается 1 раз
for (num in arr) {
currentSum += num.toLong() // Обновляем текущую сумму префикса
val target = currentSum - k.toLong() // Вычисляем разницу с целевой суммой
count += prefixSumCount.getOrDefault(target, 0) // Добавляем количество найденных подмассивов
prefixSumCount[currentSum] = prefixSumCount.getOrDefault(currentSum, 0) + 1 // Обновляем счетчик суммы префикса
}
writer.write(count.toString()) // Выводим результат
writer.newLine()
reader.close()
writer.close()
}