乱贪心一通
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2){ p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=3005;
int n,m,a[N];
int maxn,last,ans;
vector<int> B[N];
int pp[N];
int cnt[N],lst[N];
inline bool cmp(int a,int b){
return cnt[a]<cnt[b];
}
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(m);
for (int i=1;i<=n;i++){
read(a[i]);
if (a[i]>m) B[0].push_back(i);
else B[a[i]].push_back(i);
}
cnt[0]=B[0].size();
for (int i=1;i<=m;i++)
cnt[i]=B[i].size(),lst[i]=i;
sort(lst+1,lst+m+1,cmp);
maxn=n/m;
last=n%m;
while (last && cnt[0])
last--,cnt[0]--,pp[0]++;
int Pnt=m;
while (last--){
while (cnt[lst[Pnt]]==maxn) Pnt--;
cnt[lst[Pnt]]--,pp[lst[Pnt]]++;
}
sort(lst+1,lst+m+1,cmp);
int pnt=1,idx=0;
while (cnt[idx]){
while (cnt[lst[pnt]]>=maxn) pnt++;
if (pnt>m) break;
int t=B[idx][pp[idx]];
cnt[idx]--,pp[idx]++;
a[t]=lst[pnt]; ans++;
cnt[lst[pnt]]++;
}
for (int i=m;i;i--){
idx=lst[i];
while (cnt[idx]>maxn){
while (cnt[lst[pnt]]>=maxn) pnt++;
if (pnt>m) break;
int t=B[idx][pp[idx]];
cnt[idx]--,pp[idx]++;
a[t]=lst[pnt]; ans++;
cnt[lst[pnt]]++;
}
}
printf("%d %d\n",maxn,ans);
for (int i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}