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
题意:通过改变歌曲的演唱者,使1到m的每个band表演的歌曲数目的最小值达到最大.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxn 1000005
#define MOD 1000000007
using namespace std;
typedef long long ll;
int num[2005], p[2005];
int main(){
//freopen("in.txt", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d", num+i);
int k1 = n / m;
for(int i = 0; i < n; i++){
if(num[i] <= m)
p[num[i]]++;
}
int j = 0, ans = 0;
for(int i = 1; i <= m; i++){
if(p[i] < k1){
for(; j < n; j++){
if(num[j] > m){
num[j] = i;
p[i]++;
ans++;
}
else if(p[num[j]] > k1){
p[num[j]]--;
num[j] = i;
p[i]++;
ans++;
}
if(p[i] == k1)
break;
}
}
}
printf("%d %d\n", k1, ans);
for(int i = 0; i < n; i++){
if(i != 0)
putchar(' ');
printf("%d", num[i]);
}
puts("");
return 0;
}