using
System;
using
System.Collections.Generic;
class
GFG{
static
void
getPrimesFromSeive(HashSet<String> primes)
{
bool
[]prime =
new
bool
[1000001];
for
(
int
i = 0; i < 1000001; i++)
prime[i] =
true
;
prime[0] = prime[1] =
false
;
for
(
int
i = 2; i * i <= 1000000; i++)
{
if
(prime[i] ==
true
)
{
for
(
int
j = i * i; j <= 1000000; j += i)
prime[j] =
false
;
}
}
for
(
int
i = 2; i <= 1000000; i++)
{
if
(prime[i] ==
true
)
primes.Add(String.Join(
""
, i));
}
}
static
int
splitIntoPrimes(String number)
{
int
numLen = number.Length;
int
[]splitDP =
new
int
[numLen + 1];
for
(
int
i = 0; i < numLen + 1; i++)
splitDP[i] = -1;
HashSet<String> primes =
new
HashSet<String>();
getPrimesFromSeive(primes);
for
(
int
i = 1; i <= numLen; i++)
{
if
(i <= 6 && (primes.Contains
(number.Substring(0, i))))
splitDP[i] = 1;
if
(splitDP[i] != -1)
{
for
(
int
j = 1; j <= 6 && i + j <= numLen; j++)
{
if
(primes.Contains(number.Substring(i, j)))
{
if
(splitDP[i + j] == -1)
splitDP[i + j] = 1 + splitDP[i];
else
splitDP[i + j] = Math.Min(splitDP[i + j],
1 + splitDP[i]);
}
}
}
}
return
splitDP[numLen];
}
public
static
void
Main(String[] args)
{
Console.Write(splitIntoPrimes(
"13499315"
) +
"\n"
);
Console.Write(splitIntoPrimes(
"43"
) +
"\n"
);
}
}