0676 - Count Prim Sub

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinţa

Considerăm un arbore binar cu n noduri în care fiecare nod este numerotat de la 1 la n și conține o valoare număr natural. Se dau k noduri din arbore și se cere determinarea, pentru fiecare nod, a numărului de noduri din subarborele cu rădăcina în acel nod care conțin valori prime.

Date de intrare

Fișierul de intrare countprimsubin.txt conține pe prima linie numărul n. Fiecare dintre următoarele n linii contine câte 3 numere X st dr; linia i + 1 din fișier conține informatiile despre nodul numerotat cu i: X reprezintă valoare din nod, st reprezintă numărul de ordine al descendentului stâng sau 0 dacă nodul i nu are descendent stâng, iar dr reprezintă numărul de ordine al descendentului drept sau 0 dacă nodul i nu are descendent drept.

Pe următoarea linie se află numărul k, iar pe fiecare dintre următoarelek linii se află câte un număr natural cuprins între 1 și n, reprezentând nodul curent.

Date de ieșire

Fișierul de ieșire countprimsubout.txt va conține k linii; fiecare linie va conține numărul de noduri din subarborele cu rădăcina în nodul corespunzător.

Restricţii şi precizări

  • 1 ≤ n ≤ 1000
  • valorile din nodurile arborelui vor fi mai mici sau egale cu 1.000.000
  • 1 ≤ k ≤ 1000

Exemplul 1

countprimsubin.txt
6
2 3 5
6 0 6
1 0 0
7 1 2
4 0 0
10 0 0
4
1
2
4
2
countprimsubout.txt
Datele de intrare corespund restrictiilor impuse
1
0
2
0

Exemplul 2

countprimsubin.txt
1002
2 0 0
3 0 0
5 0 0
7 0 0
1000001 0 0
2
1
5
countprimsubout.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare

tree = []
prime_count = []


def is_prime(n):
    if n < 2:
        return False
    if n == 2 or n == 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    w = 2
    while i * i <= n:
        if n % i == 0:
            return False
        i += w
        w = 6 - w
    return True


def dfs(node):
    global tree, prime_count
    prime_count[node] = is_prime(tree[node][0])
    if tree[node][1] != 0:
        prime_count[node] += dfs(tree[node][1])
    if tree[node][2] != 0:
        prime_count[node] += dfs(tree[node][2])
    return prime_count[node]


def main():
    global tree, prime_count
    with open('countprimsubin.txt', 'r') as fin, open('countprimsubout.txt', 'w') as fout:
        n = int(fin.readline().strip())
        tree = [[0, 0, 0] for _ in range(n+1)]
        prime_count = [0 for _ in range(n+1)]
        for i in range(1, n+1):
            x, st, dr = map(int, fin.readline().strip().split())
            tree[i] = [x, st, dr]
        k = int(fin.readline().strip())
        nodes = [int(fin.readline().strip()) for _ in range(k)]
        if n < 1 or n > 1000 or any(x < 1 or x > 1000000 for x, _, _ in tree[1:]) or k < 1 or k > 1000:
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
            return
        fout.write("Datele de intrare corespund restrictiilor impuse\n")
        for node in nodes:
            fout.write(str(dfs(node)) + '\n')


if __name__ == "__main__":
    main()