3290 - Mat D3

From Bitnami MediaWiki

Enunț[edit | edit source]

Fie o matrice cu L linii și C coloane care memorează numere naturale. O submatrice a sa având colțul stânga-sus (xs, ys) și colțul dreapta-jos (xd, yd) este formată din toate elementele din matrice având indicele liniei în intervalul [xs, xd] și indicele coloanei în intervalul [ys, yd]. O submatrice poate fi formată dintr-un singur element.

Cerința[edit | edit source]

Scrieți un program care determină numărul submatricelor care au suma elementelor divizibilă cu 3.

Date de intrare[edit | edit source]

Fișierul de intrare matd3in.txt conține pe prima linie numerele naturale L și C separate prin spațiu. Pe următoarele L linii se află câte C numere naturale separate prin câte un spațiu reprezentând câte o linie din matrice.

Date de ieșire[edit | edit source]

Fișierul de ieșire matd3out.txt va conține pe prima linie un singur număr natural K, reprezentând numărul submatricelor care au suma divizibilă cu 3.

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

  • 2 ⩽ L, C ⩽ 300
  • elementele matricei sunt numere naturale cuprinse între 0 și 10.000
  • numărul 0 este divizibil cu 3

Exemplul 1[edit | edit source]

Intrare
matd3in.txt
2 3
1 2 2
2 1 3
Ieșire
Datele de intrare corespund restricțiilor impuse
matd3out.txt
7

Explicație[edit | edit source]

Cele șapte submatrice sunt:

(1 2)
(2 1)
(2 1 3)
(3)
(1
2)
(2
1)
(1 2
2 1)

Exemplul 2[edit | edit source]

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3290 - Matd3

def validare_date(linii, coloane, matrice):

   if not (2 <= linii <= 300 and 2 <= coloane <= 300):
       return False
   for randuri in matrice:
       if len(randuri) != coloane or any(not (0 <= numere <= 10000) for numere in randuri):
           return False
   return True


def numarare_submatrici(linii, coloane, matrice):

   count = 0
   for xs in range(linii):
       for ys in range(coloane):
           for xd in range(xs, linii):
               for yd in range(ys, coloane):
                   submatrice_sum = sum(matrice[i][j] for i in range(xs, xd + 1) for j in range(ys, yd + 1))
                   if submatrice_sum % 3 == 0:
                       count += 1
   return count


def main():

   with open("matd3in.txt", "r") as file:
       linii, coloane = map(int, file.readline().split())
       matrice = [list(map(int, line.split())) for line in file]
   if validare_date(linii, coloane, matrice):
       print("Datele de intrare corespund restricțiilor impuse")
       result = numarare_submatrici(linii, coloane, matrice)
       with open("matd3out.txt", "w") as file_out:
           file_out.write(str(result))
   else:
       print("Datele de intrare NU corespund restricțiilor impuse")
       exit(0)


if __name__ == "__main__":

   main()

</syntaxhighlight>