#include <bits/stdc++.h>
using namespace std;
const int MX = 1e5;
vector<int> primes((MX + 2) / 2, 1);
void sieve() {
primes[0] = 0;
for (int i = 3; i * i <= MX; i += 2) {
if (primes[i >> 1]) {
for (int j = i * i; j <= MX; j += i) {
primes[j >> 1] = 0;
}
}
}
}
bool is_prime(int x) {
if (x == 2) return true;
if (x % 2 == 0 || x < 2) return false;
return primes[x >> 1];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
sieve();
int n;
cin >> n;
vector<vector<int>> g(n + 1);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int> size(n + 1), nodes;
function<void(int, int)> dfs = [&](int u, int parent) {
nodes.push_back(u);
for (int v : g[u]) {
if (v != parent && is_prime(v)) {
dfs(v, u);
}
}
};
long long ans = 0;
for (int u = 1; u <= n; u++) {
if (is_prime(u)) continue;
int sum = 0;
for (int v : g[u]) {
if (!is_prime(v)) continue;
if (size[v] == 0) {
nodes.clear();
dfs(v, -1);
for (int x : nodes) {
size[x] = nodes.size();
}
}
ans += 1LL * size[v] * sum;
sum += size[v];
}
ans += sum;
}
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTVggPSAxZTU7CnZlY3RvcjxpbnQ+IHByaW1lcygoTVggKyAyKSAvIDIsIDEpOyAgCgoKdm9pZCBzaWV2ZSgpIHsKICAgIHByaW1lc1swXSA9IDA7ICAKICAgIGZvciAoaW50IGkgPSAzOyBpICogaSA8PSBNWDsgaSArPSAyKSB7CiAgICAgICAgaWYgKHByaW1lc1tpID4+IDFdKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICogaTsgaiA8PSBNWDsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICBwcmltZXNbaiA+PiAxXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmJvb2wgaXNfcHJpbWUoaW50IHgpIHsKICAgIGlmICh4ID09IDIpIHJldHVybiB0cnVlOwogICAgaWYgKHggJSAyID09IDAgfHwgeCA8IDIpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBwcmltZXNbeCA+PiAxXTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIHNpZXZlKCk7ICAKCiAgICBpbnQgbjsKICAgIGNpbiA+PiBuOwoKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZyhuICsgMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIHZlY3RvcjxpbnQ+IHNpemUobiArIDEpLCBub2RlczsKICAgIGZ1bmN0aW9uPHZvaWQoaW50LCBpbnQpPiBkZnMgPSBbJl0oaW50IHUsIGludCBwYXJlbnQpIHsKICAgICAgICBub2Rlcy5wdXNoX2JhY2sodSk7CiAgICAgICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICAgICAgaWYgKHYgIT0gcGFyZW50ICYmIGlzX3ByaW1lKHYpKSB7CiAgICAgICAgICAgICAgICBkZnModiwgdSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGxvbmcgbG9uZyBhbnMgPSAwOwogICAgZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSB7CiAgICAgICAgaWYgKGlzX3ByaW1lKHUpKSBjb250aW51ZTsKICAgICAgICBpbnQgc3VtID0gMDsKICAgICAgICBmb3IgKGludCB2IDogZ1t1XSkgewogICAgICAgICAgICBpZiAoIWlzX3ByaW1lKHYpKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKHNpemVbdl0gPT0gMCkgewogICAgICAgICAgICAgICAgbm9kZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgIGRmcyh2LCAtMSk7CiAgICAgICAgICAgICAgICBmb3IgKGludCB4IDogbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgICBzaXplW3hdID0gbm9kZXMuc2l6ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucyArPSAxTEwgKiBzaXplW3ZdICogc3VtOwogICAgICAgICAgICBzdW0gKz0gc2l6ZVt2XTsKICAgICAgICB9CiAgICAgICAgYW5zICs9IHN1bTsKICAgIH0KCiAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K