import
java.util.HashMap;
import
java.util.Map;
public
class
Main {
static
boolean
isPos(
int
mid, Map<Integer, Integer> hashMap,
int
M)
{
int
numberOfSetsPosOfSizeMid =
0
;
for
(Map.Entry<Integer, Integer> entry :
hashMap.entrySet()) {
numberOfSetsPosOfSizeMid
+= (entry.getValue() / mid);
}
return
numberOfSetsPosOfSizeMid >= M;
}
static
int
findMinOp(
int
[] A,
int
N,
int
M)
{
Map<Integer, Integer> hashMap =
new
HashMap<>();
for
(
int
i =
0
; i < N; i++) {
hashMap.put(A[i],
hashMap.getOrDefault(A[i],
0
) +
1
);
}
int
low =
1
, high = (
int
)1e9;
while
(high - low >
1
) {
int
mid = (low + high) /
2
;
if
(isPos(mid, hashMap, M)) {
low = mid;
}
else
{
high = mid -
1
;
}
}
if
(isPos(high, hashMap, M))
return
high;
else
if
(isPos(low, hashMap, M))
return
low;
else
return
-
1
;
}
public
static
void
main(String[] args)
{
int
N =
10
, M =
4
;
int
[] A = {
1
,
5
,
2
,
1
,
1
,
1
,
2
,
5
,
7
,
2
};
System.out.println(findMinOp(A, N, M));
int
N1 =
5
, M1 =
2
;
int
[] A1 = {
5
,
4
,
3
,
2
,
1
};
System.out.println(findMinOp(A1, N1, M1));
}
}