Polycarp is a music editor at the radio station. He received a playlist for tomorrow, that can be represented as a sequence a1, a2, ..., an, where ai is a band, which performs the i-th song. Polycarp likes bands with the numbers from 1 to m, but he doesn't really like others.
We define as bj the number of songs the group j is going to perform tomorrow. Polycarp wants to change the playlist in such a way that the minimum among the numbers b1, b2, ..., bm will be as large as possible.
Find this maximum possible value of the minimum among the bj (1 ≤ j ≤ m), and the minimum number of changes in the playlist Polycarp needs to make to achieve it. One change in the playlist is a replacement of the performer of the i-th song with any other group.
The first line of the input contains two integers n and m (1 ≤ m ≤ n ≤ 2000).
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109), where ai is the performer of the i-th song.
In the first line print two integers: the maximum possible value of the minimum among the bj (1 ≤ j ≤ m), where bj is the number of songs in the changed playlist performed by the j-th band, and the minimum number of changes in the playlist Polycarp needs to make.
In the second line print the changed playlist.
If there are multiple answers, print any of them.
4 2
1 2 3 2
2 1
1 2 1 2
7 3
1 3 2 2 2 2 1
2 1
1 3 3 2 2 2 1
4 4
1000000000 100 7 1000000000
1 4
1 2 3 4
In the first sample, after Polycarp's changes the first band performs two songs (b1 = 2), and the second band also performs two songs (b2 = 2). Thus, the minimum of these values equals to 2. It is impossible to achieve a higher minimum value by any changes in the playlist.
In the second sample, after Polycarp's changes the first band performs two songs (b1 = 2), the second band performs three songs (b2 = 3), and the third band also performs two songs (b3 = 2). Thus, the best minimum value is 2.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <map>
using namespace std;
int n,m;
int a[2005];
vector<int>brand[2005];
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(a[i] > m) {
brand[0].push_back(i);//比赛的时候没理解题意,写成了这样 if(a[i]>m)a[i] = 0;brand[a[i]].push_back(i)
}else{
brand[a[i]].push_back(i);
}
}//上述那样处理之后,修改的次数就会变多了比如输入//5 4 3 1 495987801 522279660 762868488 ;ave = 1;修改成3 1 2 4 762868488;这样的次数才是最少的,并不是把最后一个修改
int ave = n/m;
int tol = 0;
for(int i = 1; i <= m; i++) {
if(brand[i].size() < ave) {
int change = ave-brand[i].size();
tol += change;
for(int j = 0; j <= m && change>0; j++) {
vector<int>::iterator it = brand[j].begin();
while(j == 0 && brand[j].size() > 0 && change>0) {
int pos = *it;
change--;
a[pos] = i;
brand[i].push_back(pos);
brand[j].erase(it);
}
while(j > 0 && brand[j].size() > ave && change>0) {
int pos = *it;
change--;
a[pos] = i;
brand[i].push_back(pos);
brand[j].erase(it);
}
}
}
}
cout << ave << " " << tol << endl;
cout << a[1];
for(int i = 2; i <= n; i++) {
cout << " " << a[i];
}
cout << endl;
return 0;
}