#include<iostream>
using namespace std;
int flag[10005]; //堆空间,默认初始化全是0,等价于 int flag[10005]={0};
//flag值为0表示没水塘,为1表示有水塘
int main(){
int n,m,k; //n,m,k分别代表路径的长度,积水的个数以及wzy一次最远可以跨多远
int num;
cin>>n>>m>>k;
for(int i=1;i<=m;i++){ //将有水塘的点赋值为1
cin>>num;
flag[num]=1;
}
int left=0,right=1,count=0; //count为需要踩水塘的次数
int begin=1,end=n; //重新定义begin,end变量,方便分类讨论
//若第一点有水塘
if(flag[1]==1){
for(int i=2;i<=n;i++){ //找到第二个是水塘的点
if(flag[i]==0){
right=i;
break;
}
}
count+=(right-1-1)/k+1;
begin=right;
}
//如果最后一个点有水塘
if(flag[n]==1){
for(int i=n-1;i>=1;i--){//找到倒数第二个是水塘的点
if(flag[i]==0){
left=i;
break;
}
}
count+=(n-left-1)/k+1;
end=left;
}
//此时起点和终点都没有水塘
if(begin!=end){
for(int i=begin;i<=end;i++){
if(flag[i]==0){
left=i;
int j;
for(j=i+1;j<=end;j++){
if(flag[j]==0){
right=j;
break;
}
}
if(j>end) break; //不写这句会陷入死循环!
count+=(right-left-1)/k;
}
i=right-1;
}
}
//输出结果
cout<<count<<endl;
return 0;
}