import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

long calc(int K, int[] a) {
    long ans = long.max;
    int n = cast(int) a.length;
    auto buf = new int[n];
    auto mask = new bool[n];
    for (int i = 1; i < (1 << n); i++) {
        // a[0] は必ず見えてしまうのでビットを立てる
        if (!(i & (1 << 0))) continue;

        mask[] = false;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                mask[j] = true;
            }
        }
        if (mask.count(true) != K) continue;

        buf[] = a[];
        if (K > 1) {
            for (int j = 0; j < n; j++) {
                for (int k = j + 1; k < n; k++) {
                    if (mask[j] && mask[k]) {
                        // j と k の間にある壁は j より低くする
                        int h = buf[j];
                        for (int m = j; m < k; m++) {
                            h = max(h, buf[m]);
                        }

                        buf[j] = h;
                        buf[k] = max(h + 1, buf[k]);
                        break;
                    }
                }
            }
        }

        // ラストのビットの壁を一番高くする(それより後ろの壁は見えなくする)
        int h = 0;
        for (int j = n - 1; j >= 0; j--) {
            h = max(h, buf[j]);
            if (mask[j]) {
                buf[j] = h;
                break;
            }
        }

        long cost = 0;
        for (int j = 0; j < n; j++) {
            cost += buf[j] - a[j];
        }
        ans = min(ans, cost);
    }
    return ans;
}

void main() {
    auto nk = readints;
    int k = nk[1];
    auto a = readints;
    writeln(calc(k, a));
}
