import
java.util.ArrayList;
import
java.util.Arrays;
public
class
Main {
static
int
dfs(
int
node, ArrayList<ArrayList<Integer>> adj,
boolean
[] prime,
int
[] vis,
int
[] ans,
int
K) {
if
(ans[
0
] >
0
)
return
0
;
vis[node] =
1
;
int
ele =
0
;
if
(prime[node])
ele +=
1
;
for
(
int
j : adj.get(node)) {
if
(vis[j] ==
0
) {
ele += dfs(j, adj, prime, vis, ans, K);
}
}
if
(ele == K) {
ans[
0
] +=
1
;
}
return
ele;
}
static
boolean
hasKPrimeSubtree(
int
N,
int
K, ArrayList<ArrayList<Integer>> edges) {
ArrayList<ArrayList<Integer>> adj =
new
ArrayList<>();
for
(
int
i =
0
; i <= N; i++) {
adj.add(
new
ArrayList<>());
}
for
(ArrayList<Integer> j : edges) {
int
u = j.get(
0
);
int
v = j.get(
1
);
adj.get(u).add(v);
adj.get(v).add(u);
}
boolean
[] prime =
new
boolean
[N +
1
];
Arrays.fill(prime,
true
);
prime[
0
] = prime[
1
] =
false
;
for
(
int
p =
2
; p * p <= N; ++p) {
if
(prime[p]) {
for
(
int
i = p * p; i <= N; i += p)
prime[i] =
false
;
}
}
int
[] vis =
new
int
[N +
1
];
int
[] ans = {
0
};
int
ele = dfs(
1
, adj, prime, vis, ans, K);
return
ans[
0
] >
0
;
}
public
static
void
main(String[] args) {
int
N =
3
;
int
K =
1
;
ArrayList<ArrayList<Integer>> edges =
new
ArrayList<>();
edges.add(
new
ArrayList<>(Arrays.asList(
1
,
3
)));
edges.add(
new
ArrayList<>(Arrays.asList(
1
,
2
)));
System.out.println(hasKPrimeSubtree(N, K, edges));
}
}