using
System;
using
System.Collections.Generic;
using
System.Linq;
class
GFG {
static
void
Main(
string
[] args)
{
int
N = 5;
int
M = 7;
int
[] nums = { 6, 4, 5, 3, 7 };
Console.WriteLine(findMinDifference(nums, N, M));
}
static
List<
int
> factorsOfNumber(
int
n)
{
List<
int
> factors =
new
List<
int
>{ 1 };
if
(n == 1)
return
factors;
for
(
int
i = 2; i * i <= n; i++) {
if
(n % i == 0) {
if
(n / i == i) {
factors.Add(i);
}
else
{
factors.Add(i);
factors.Add(n / i);
}
}
}
factors.Add(n);
return
factors;
}
static
int
findMinDifference(
int
[] nums,
int
N,
int
M)
{
Array.Sort(nums);
List<List<
int
> > factors =
new
List<List<
int
> >();
for
(
int
k = 0; k < N; k++) {
factors.Add(factorsOfNumber(nums[k]));
}
Dictionary<
int
,
int
> factorFreq
=
new
Dictionary<
int
,
int
>();
int
i = 0;
int
j = 0;
int
minDiff =
int
.MaxValue;
while
(i < N && j < N) {
if
(factorFreq.Count == M) {
minDiff = Math.Min(minDiff,
nums[j - 1] - nums[i]);
for
(
int
k = 0; k < factors[i].Count; k++) {
if
(factors[i][k] <= M) {
factorFreq[factors[i][k]] -= 1;
if
(factorFreq[factors[i][k]]
== 0) {
factorFreq.Remove(
factors[i][k]);
}
}
}
i += 1;
}
else
{
for
(
int
k = 0; k < factors[j].Count; k++) {
if
(factors[j][k] <= M) {
if
(factorFreq.ContainsKey(
factors[j][k])) {
factorFreq[factors[j][k]] += 1;
}
else
{
factorFreq.Add(factors[j][k],
1);
}
}
}
j += 1;
}
}
while
(i < N && factorFreq.Count == M) {
minDiff
= Math.Min(minDiff, nums[j - 1] - nums[i]);
for
(
int
k = 0; k < factors[i].Count; k++) {
if
(factors[i][k] <= M) {
factorFreq[factors[i][k]] -= 1;
if
(factorFreq[factors[i][k]] == 0) {
factorFreq.Remove(factors[i][k]);
}
}
}
i += 1;
}
if
(minDiff ==
int
.MaxValue)
return
-1;
else
return
minDiff;
}
}