fun main(args: Array<String>) {
    val (n, k) = readLine()!!.split(" ").map { it.toInt() }
    val inputs = readLine()!!.split(" ").map { it.toInt() }

    // k 個のブロックの中に１を入れて左右に広げていく
    // 1 が入っているブロックが端にある場合

    var flag = false
    for (i in 0..k - 1) {
        if (inputs[i] == 1) {
            flag = true
        }
    }
    for (i in n - k until n) {
        if (inputs[i] == 1) {
            flag = true
        }
    }

    if (flag) {
        // WA: ceil を使わず実装して間違えていたので注意
        println(Math.ceil((n.toDouble() - k) / (k - 1)).toInt() + 1)
        return
    }

    // 1 が入っているブロックが内部にある場合
    // -> そこで配列を２つに分割してそれぞれを端から塗っていく場合を考える
    var index = 0
    for (i in 0 until n) {
        if (inputs[i] == 1) {
            index = i
        }
    }


    // 左側残りをまず塗る( １はブロック内の右端に寄せると仮定）
    // WA: 寄せずに真ん中配置の方が１の配置によってはブロック数を減らせる場合がある
    // -> 左端，右端，中心ケースをすべて求める？？

    var min = Int.MAX_VALUE

    // 右端ケース
    var restL = (index + 1 - k)
    var restR = n - (index + 1)
    var ans = (Math.ceil(restL.toDouble() / (k - 1)) + Math.ceil(restR.toDouble() / (k - 1))).toInt() + 1
    min = Math.min(ans, min)

    // 左端ケース
    restL = (index + 1 - 1)
    restR = n - (index + k)
    ans = (Math.ceil(restL.toDouble() / (k - 1)) + Math.ceil(restR.toDouble() / (k - 1))).toInt() + 1
    min = Math.min(ans, min)

    // 中央ケース
    restL = (index + 1 - Math.ceil(k.toDouble()/2).toInt())
    restR = n - (index + Math.ceil(k.toDouble()/2).toInt())
    ans = (Math.ceil(restL.toDouble() / (k - 1)) + Math.ceil(restR.toDouble() / (k - 1))).toInt() + 1
    min = Math.min(ans, min)

    println(min)
}