import
java.util.ArrayList;
import
java.util.HashSet;
import
java.util.List;
import
java.util.Set;
public
class
Main {
public
static
List<Integer> primeFactors(
int
n)
{
List<Integer> factors =
new
ArrayList<Integer>();
int
d =
2
;
while
(d * d <= n) {
while
(n % d ==
0
) {
factors.add(d);
n /= d;
}
d +=
1
;
}
if
(n >
1
) {
factors.add(n);
}
return
factors;
}
public
static
List<Integer> generatePrimes(
int
limit)
{
List<Integer> primes =
new
ArrayList<Integer>();
for
(
int
n =
2
; n <= limit; n++) {
boolean
isPrime =
true
;
for
(
int
i =
2
; i <= Math.sqrt(n); i++) {
if
(n % i ==
0
) {
isPrime =
false
;
break
;
}
}
if
(isPrime) {
primes.add(n);
}
}
return
primes;
}
public
static
Set<Integer>
calculateFactors(
int
n, List<Integer> primes)
{
Set<Integer> factors =
new
HashSet<Integer>();
factors.add(
1
);
factors.add(n);
for
(
int
i =
1
; i < primes.size(); i++) {
List<List<Integer> > combinations
= combinations(primes, i);
for
(List<Integer> comb : combinations) {
int
factor =
1
;
for
(
int
p : comb) {
factor *= p;
}
factors.add(factor);
factors.add(n / factor);
}
}
return
factors;
}
public
static
boolean
checkIfXExists(
int
n,
int
k)
{
List<Integer> primes = generatePrimes(n);
for
(
int
x =
2
; x <= n; x++) {
Set<Integer> factors
= calculateFactors(x, primes);
int
numPrimes =
0
;
for
(
int
f : factors) {
if
(primes.contains(f)) {
numPrimes++;
}
}
if
(factors.size() == n && numPrimes == k) {
return
true
;
}
}
return
false
;
}
public
static
List<List<Integer> >
combinations(List<Integer> list,
int
size)
{
List<List<Integer> > result
=
new
ArrayList<List<Integer> >();
if
(size ==
0
) {
result.add(
new
ArrayList<Integer>());
return
result;
}
for
(
int
i =
0
; i < list.size(); i++) {
int
head = list.get(i);
List<Integer> rest =
new
ArrayList<Integer>(
list.subList(i +
1
, list.size()));
for
(List<Integer> comb :
combinations(rest, size -
1
)) {
comb.add(head);
result.add(comb);
}
}
return
result;
}
public
static
void
main(String[] args)
{
System.out.println(
checkIfXExists(
4
,
2
));
}
}