using
System;
public
class
GFG
{
private
static
bool
[] prime;
private
static
void
sieve(
int
n)
{
prime =
new
bool
[n + 1];
for
(
int
i = 0; i < prime.Length; i++)
prime[i] =
true
;
for
(
int
p = 2; p * p <= n;
p++) {
if
(prime[p] ==
true
)
{
for
(
int
i = p * p;
i <= n; i += p)
prime[i] =
false
;
}
}
}
private
static
int
MinWays(
int
[,] a,
int
n,
int
m)
{
int
[] dp =
new
int
[1 << m];
for
(
int
i = 0; i < dp.Length;i++)
{
dp[i] = n + 1;
}
for
(
int
i = 0; i < a.GetLength(0);
i++)
{
int
bitmask = BitMask(GetRow(a,i));
for
(
int
j = (1 << m) - 1;
j >= 0; j--)
{
if
(dp[j] != n + 1)
{
dp[j | bitmask]
= Math.Min(dp[j | bitmask],
dp[j] + 1);
}
}
dp[bitmask] = 1;
}
return
(dp[(1 << m) - 1] - 1) == (n + 1)
? -1
: (dp[(1 << m) - 1] - 1);
}
private
static
int
BitMask(
int
[] a)
{
int
bitmask = 0;
for
(
int
i = 0; i < a.Length;
i++) {
if
(prime[a[i]])
{
bitmask |= (1 << i);
}
}
return
bitmask;
}
public
static
int
[] GetRow(
int
[,] matrix,
int
row)
{
var
rowLength = matrix.GetLength(1);
var
rowVector =
new
int
[rowLength];
for
(
var
i = 0; i < rowLength; i++)
rowVector[i] = matrix[row, i];
return
rowVector;
}
public
static
void
Main(String[] args)
{
int
[,] mat = { { 4, 6, 5, 8 },
{ 2, 9, 12, 14 },
{ 32, 7, 18, 16 },
{ 12, 4, 35, 17 } };
int
m = mat.GetLength(0);
int
n = mat.GetLength(1);
int
max = 10000;
sieve(max);
Console.WriteLine(
MinWays(mat, n, m));
}
}