Skip to content

Commit 8d2ba7f

Browse files
authored
feat: add solutions to lc problem: No.2867 (doocs#1674)
No.2867.Count Valid Paths in a Tree
1 parent fc5ecb1 commit 8d2ba7f

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class Solution {
2+
long long mul(long long x, long long y) {
3+
return x * y;
4+
}
5+
6+
pair<int, int> dfs(int x, int f, const vector<vector<int>>& con, const vector<bool>& prime, long long& r) {
7+
pair<int, int> v = {!prime[x], prime[x]};
8+
for (int y : con[x]) {
9+
if (y == f) continue;
10+
const auto& p = dfs(y, x, con, prime, r);
11+
r += mul(p.first, v.second) + mul(p.second, v.first);
12+
if (prime[x]) {
13+
v.second += p.first;
14+
} else {
15+
v.first += p.first;
16+
v.second += p.second;
17+
}
18+
}
19+
return v;
20+
}
21+
22+
public:
23+
long long countPaths(int n, vector<vector<int>>& edges) {
24+
vector<bool> prime(n + 1, true);
25+
prime[1] = false;
26+
vector<int> all;
27+
for (int i = 2; i <= n; ++i) {
28+
if (prime[i]) {
29+
all.push_back(i);
30+
}
31+
for (int x : all) {
32+
const int temp = i * x;
33+
if (temp > n) {
34+
break;
35+
}
36+
prime[temp] = false;
37+
if (i % x == 0) {
38+
break;
39+
}
40+
}
41+
}
42+
vector<vector<int>> con(n + 1);
43+
for (const auto& e : edges) {
44+
con[e[0]].push_back(e[1]);
45+
con[e[1]].push_back(e[0]);
46+
}
47+
long long r = 0;
48+
dfs(1, 0, con, prime, r);
49+
return r;
50+
}
51+
};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
class Solution {
2+
public long countPaths(int n, int[][] edges) {
3+
List<Boolean> prime = new ArrayList<>(n + 1);
4+
for (int i = 0; i <= n; ++i) {
5+
prime.add(true);
6+
}
7+
prime.set(1, false);
8+
9+
List<Integer> all = new ArrayList<>();
10+
for (int i = 2; i <= n; ++i) {
11+
if (prime.get(i)) {
12+
all.add(i);
13+
}
14+
for (int x : all) {
15+
int temp = i * x;
16+
if (temp > n) {
17+
break;
18+
}
19+
prime.set(temp, false);
20+
if (i % x == 0) {
21+
break;
22+
}
23+
}
24+
}
25+
26+
List<List<Integer>> con = new ArrayList<>(n + 1);
27+
for (int i = 0; i <= n; ++i) {
28+
con.add(new ArrayList<>());
29+
}
30+
for (int[] e : edges) {
31+
con.get(e[0]).add(e[1]);
32+
con.get(e[1]).add(e[0]);
33+
}
34+
35+
long[] r = {0};
36+
dfs(1, 0, con, prime, r);
37+
return r[0];
38+
}
39+
40+
private long mul(long x, long y) {
41+
return x * y;
42+
}
43+
44+
private class Pair {
45+
int first;
46+
int second;
47+
48+
Pair(int first, int second) {
49+
this.first = first;
50+
this.second = second;
51+
}
52+
}
53+
54+
private Pair dfs(int x, int f, List<List<Integer>> con, List<Boolean> prime, long[] r) {
55+
Pair v = new Pair(!prime.get(x) ? 1 : 0, prime.get(x) ? 1 : 0);
56+
for (int y : con.get(x)) {
57+
if (y == f) continue;
58+
Pair p = dfs(y, x, con, prime, r);
59+
r[0] += mul(p.first, v.second) + mul(p.second, v.first);
60+
if (prime.get(x)) {
61+
v.second += p.first;
62+
} else {
63+
v.first += p.first;
64+
v.second += p.second;
65+
}
66+
}
67+
return v;
68+
}
69+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class Solution:
2+
def countPaths(self, n: int, edges: List[List[int]]) -> int:
3+
def mul(x, y):
4+
return x * y
5+
6+
def dfs(x, f, con, prime, r):
7+
v = [1 - prime[x], prime[x]]
8+
for y in con[x]:
9+
if y == f:
10+
continue
11+
p = dfs(y, x, con, prime, r)
12+
r[0] += mul(p[0], v[1]) + mul(p[1], v[0])
13+
if prime[x]:
14+
v[1] += p[0]
15+
else:
16+
v[0] += p[0]
17+
v[1] += p[1]
18+
return v
19+
20+
prime = [True] * (n + 1)
21+
prime[1] = False
22+
23+
all_primes = []
24+
for i in range(2, n + 1):
25+
if prime[i]:
26+
all_primes.append(i)
27+
for x in all_primes:
28+
temp = i * x
29+
if temp > n:
30+
break
31+
prime[temp] = False
32+
if i % x == 0:
33+
break
34+
35+
con = [[] for _ in range(n + 1)]
36+
for e in edges:
37+
con[e[0]].append(e[1])
38+
con[e[1]].append(e[0])
39+
40+
r = [0]
41+
dfs(1, 0, con, prime, r)
42+
return r[0]

0 commit comments

Comments
 (0)