using
System;
class
GFG
{
static
int
[]st;
static
int
gcd(
int
a,
int
b)
{
if
(a < b)
swap(a, b);
if
(b == 0)
return
a;
return
gcd(b, a % b);
}
private
static
void
swap(
int
x,
int
y)
{
int
temp = x;
x = y;
y = temp;
}
static
int
findGcd(
int
ss,
int
se,
int
qs,
int
qe,
int
si)
{
if
(ss > qe || se < qs)
return
0;
if
(qs <= ss && qe >= se)
return
st[si];
int
mid = ss + (se - ss) / 2;
return
gcd(findGcd(ss, mid, qs, qe, si * 2 + 1),
findGcd(mid + 1, se, qs, qe, si * 2 + 2));
}
static
int
findRangeGcd(
int
ss,
int
se,
int
[]arr,
int
n)
{
if
(ss < 0 || se > n-1 || ss > se)
{
Console.WriteLine(
"Invalid Arguments"
);
return
-1;
}
return
findGcd(0, n - 1, ss, se, 0);
}
static
int
constructST(
int
[]arr,
int
ss,
int
se,
int
si)
{
if
(ss == se)
{
st[si] = arr[ss];
return
st[si];
}
int
mid = ss + (se - ss) / 2;
st[si] = gcd(constructST(arr, ss, mid, si * 2 + 1),
constructST(arr, mid+1, se, si * 2 + 2));
return
st[si];
}
static
int
[]constructSegmentTree(
int
[]arr,
int
n)
{
int
height = (
int
)(Math.Ceiling(Math.Log(n)));
int
size = 2*(
int
)Math.Pow(2, height) - 1;
st =
new
int
[size];
constructST(arr, 0, n - 1, 0);
return
st;
}
static
int
findSmallestSubarr(
int
[]arr,
int
n,
int
k)
{
bool
found =
false
;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] == k)
return
1;
if
(arr[i] % k == 0)
found =
true
;
}
if
(found ==
false
)
return
-1;
constructSegmentTree(arr, n);
int
res = n + 1;
for
(
int
i = 0; i < n - 1; i++)
{
if
(arr[i] % k != 0)
continue
;
int
low = i + 1;
int
high = n - 1;
int
closest = 0;
while
(
true
)
{
int
mid = low + (high-low)/2;
int
gcd = findRangeGcd(i, mid, arr, n);
if
(gcd > k)
low = mid;
else
if
(gcd == k)
{
high = mid;
closest = mid;
}
else
high = mid;
if
(Math.Abs(high-low) <= 1)
{
if
(findRangeGcd(i, low, arr, n) == k)
closest = low;
else
if
(findRangeGcd(i, high, arr, n)==k)
closest = high;
break
;
}
}
if
(closest != 0)
res = Math.Min(res, closest - i + 1);
}
return
(res == n+1) ? -1 : res;
}
public
static
void
Main(String []args)
{
int
n = 8;
int
k = 3;
int
[]arr = {6, 9, 7, 10, 12, 24, 36, 27};
Console.WriteLine(
"Size of smallest sub-array with given"
+
" size is "
+ findSmallestSubarr(arr, n, k));
}
}