#include <iostream>
#include <queue>
using namespace std;
const int N=1e5+1;
int n,k,s=0;
long long w[N],ans1=0,ans2=0,sum=0;
struct Queee{
long long w,tim;
int num;
};
struct cmp{
bool operator() (Queee o,Queee p)
{
if(o.w==p.w) return o.tim<=p.tim;
return o.w<=p.w;
}
};
struct Node{
long long w,time,son[11]={-1};
}tre[N];
long long dfs(long long u)
{
sum++;
if(tre[u].time==0) {
long long hui=sum;
sum=0;
return hui;
}
for(int i=1;i<=k&&tre[u].son[i]!=-1;i++)
{
ans1+=dfs(tre[u].son[i]);
ans2=max(ans2,dfs(tre[u].son[i]));
}
if(u==s)
return ans1;
}
int main() {
priority_queue<Queee,vector<Queee>, cmp> q;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>w[i];
q.push({w[i],0,i});
}
int ou=0;
while(q.size()!=1)
{
ou++;
long long sum=0;
int i;
for(i=1;i<=k&&q.size()!=0;i++)
{
Queee nw=q.top();
q.pop();
tre[s].w=nw.w;
tre[s].time=nw.tim;
sum+=nw.w;
}
i--;
tre[s].w=sum;
tre[s].time=ou;
for(int j=s-i;j<=s-1;j++)
tre[s].son[j-s]=j;
q.push({sum,ou,-1});
}
cout<<dfs(s);
cout<<ans2;
return 0;
}