1700 - Produs Matrice Rara

De la Universitas MediaWiki

Cerința

Într-un tărâm digital, există o aplicație specializată în manipularea structurilor de date neomogene numită MatrixMaster. Această aplicație permite utilizatorilor să gestioneze și să opereze asupra matricelor rare (matrice care conțin majoritatea elementelor zero). O operație frecvent utilizată este calculul produsului scalar între o astfel de matrice rară și un vector dat. Sarcina ta este de a implementa această funcționalitate pentru MatrixMaster.

Date de intrare

Programul citește de la tastatură:

Dimensiunea n a matricei pătratice rare (n x n). m perechi de valori (i, j, val) reprezentând elementele nenule ale matricei, unde i este indicele de rând, j este indicele de coloană și val este valoarea elementului de la acea poziție. Un vector de dimensiune n.

Date de ieșire

Pe ecran se va afișa vectorul rezultat din produsul scalar între matricea rară și vectorul dat.

Restricții și precizări

  • 1 ⩽ n ⩽ 1000
  • 0 ⩽ m ⩽ n^2

Valorile i și j sunt indexate de la 0 la n-1 Valorile din matrice și vector sunt numere întregi în intervalul [-1000, 1000]

Exemplu 1

Intrare

3
2
0 1 5
2 0 3
[1, 2, 3]

Iesire

[10, 0, 3]

Exemplu 2

Intrare

2
3
0 0 4
0 1 7
1 0 1
[2, 3]

Iesire

[29, 2]

Rezolvare

def citeste_date():
    n = int(input("Introduceți dimensiunea matricii pătratice rare (n): "))
    m = int(input("Introduceți numărul de elemente nenule (m): "))
    
    elemente_nenule = []
    for _ in range(m):
        i, j, val = map(int, input("Introduceți (i, j, val): ").split())
        elemente_nenule.append((i, j, val))
    
    vector = list(map(int, input("Introduceți vectorul (valori separate prin spațiu): ").split()))
    
    return n, elemente_nenule, vector

def valideaza_date(n, elemente_nenule, vector):
    if not (1 <= n <= 1000):
        return False
    if not (0 <= len(elemente_nenule) <= n * n):
        return False
    if len(vector) != n:
        return False
    for i, j, val in elemente_nenule:
        if not (0 <= i < n and 0 <= j < n and -1000 <= val <= 1000):
            return False
    if not all(-1000 <= val <= 1000 for val in vector):
        return False
    return True

def produs_scalar_matrice_vector(n, elemente_nenule, vector):
    rezultat = [0] * n
    for i, j, val in elemente_nenule:
        rezultat[i] += val * vector[j]
    return rezultat

def main():
    n, elemente_nenule, vector = citeste_date()
    
    if not valideaza_date(n, elemente_nenule, vector):
        print("Datele de intrare nu corespund restricțiilor impuse.")
        return
    
    print("Datele de intrare corespund restricțiilor impuse.")
    rezultat = produs_scalar_matrice_vector(n, elemente_nenule, vector)
    print(rezultat)

if __name__ == "__main__":
    main()