1209 - T Drept

From Bitnami MediaWiki

Enunț[edit | edit source]

Se consideră N puncte de coordonate întregi în sistemul de coordonate cartezian.

Cerința[edit | edit source]

Scrieţi un program care determină numărul de triunghiuri dreptunghice având vârfurile plasate în 3 dintre punctele date şi catetele respectiv paralele cu axele de coordonate.

Date de intrare[edit | edit source]

Fișierul de intrare tdreptin.txt conține pe prima linie numărul natural N, care reprezintă numărul de puncte. Pe următoarele N linii se află câte două numere naturale x y, separate prin spaţiu, reprezentând coordonatele carteziene ale celor N puncte (abscisa şi ordonata).

Date de ieșire[edit | edit source]

Fișierul de ieșire tdreptout.txt va conține o singură linie pe care va fi scris un număr natural reprezentând numărul de triunghiuri dreptunghice care respectă condiţiile din enunţ. Deoarece numărul de soluţii poate fi foarte mare, rezultatul va fi afişat modulo 666013 (adică restul împărţirii rezultatului la 666013).

Restricții și precizări[edit | edit source]

  • 3 ⩽ N ⩽ 100.000
  • 0 ⩽ x, y ⩽ 100.000
  • Cele N puncte din fişierul de intrare sunt distincte două câte două.

Exemplul 1[edit | edit source]

Intrare
tdreptin.txt
8
1 1
1 4
10 8
4 1
9 1
5 5
7 4
7 5
Ieșire
Datele de intrare corespund restricțiilor impuse
tdreptout.txt
5

Explicație[edit | edit source]

Triunghiurile dreptunghice formate sunt:

(1,1) (1,4) (4,1)
(1,1) (9,1) (1,4)
(5,5) (7,4) (7,5)
(1,4) (7,4) (7,5)
(1,1) (1,4) (7,4)

Exemplul 2[edit | edit source]

Intrare
tdreptin.txt
2
1 1
1 4
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1209 - TDrept

def validare_date(x, y):

   return 3 <= len(x) <= 100000 and all(0 <= xi <= 100000 and 0 <= yi <= 100000 for xi, yi in zip(x, y))


def numar_triunghiuri_dreptunghice(x, y):

   n = len(x)
   rezultat = 0
   for i in range(n):
       for j in range(i + 1, n):
           for k in range(j + 1, n):
               if (x[i] == x[j] or x[j] == x[k] or x[i] == x[k]) and \
                  (y[i] == y[j] or y[j] == y[k] or y[i] == y[k]):
                   rezultat += 1
   return rezultat % 666013


def citire_date():

   with open("tdreptin.txt", "r") as f:
       n = int(f.readline().strip())
       x = []
       y = []
       for _ in range(n):
           xi, yi = map(int, f.readline().split())
           x.append(xi)
           y.append(yi)
   return n, x, y


def scrie_rezultat(rezultat):

   with open("tdreptout.txt", "w") as f:
       f.write(str(rezultat))


if __name__ == "__main__":

   n, x, y = citire_date()
   if validare_date(x, y):
       print("Datele de intrare corespund restricțiilor impuse")
       rezultat = numar_triunghiuri_dreptunghice(x, y)
       scrie_rezultat(rezultat)
   else:
       print("Datele de intrare NU corespund restricțiilor impuse")
       exit(0)

</syntaxhighlight>