0242 - Interclas M

From Bitnami MediaWiki

Cerința

Se dă un număr natural x și două șiruri a și b, cu n, respectiv m elemente, numere naturale, ordonate strict crescător. Să se afișeze, în ordine crescătoare, multiplii lui x care se află doar în unul dintre cele două șiruri.

Date de intrare

Fișierul de intrare interclasm.in conține pe prima linie numărul x, pe linia a doua numărul n; urmează n numere naturale, ordonate crescător, ce pot fi dispuse pe mai multe linii. Linia următoare conține numărul m și urmează m numere naturale, ordonate crescător, ce pot fi dispuse pe mai multe linii.

Date de ieșire

Fișierul de ieșire interclasm.out va conține pe prima linie valorile determinate, separate printr-un spațiu.

Restricții și precizări

  • 1 ⩽ x ⩽ 999.999
  • 1 ⩽ n, m ⩽ 100.000
  • valorile elementelor celor două șiruri vor fi mai mici decât 1.000.000

Exemplu 1

interclasm.in
5
7
1 2 3 4
7 20 60
9
3 5 7
8 9 10 12
20 24
interclasm.out
5 10 60


Exemplu 2

interclasm.in
2
0
1
7
interclasm.out
Nu au fost respectate cerintele impuse


Rezolvare

<syntaxhighlight lang="python" line>

  1. 0242 - InterclasM

def multiplii_x_unice(x, a, b):

   rezultat = set()
   i, j = 0, 0
   while i < len(a) and j < len(b):
       if a[i] % x == 0 and b[j] % x != 0:
           rezultat.add(a[i])
           i += 1
       elif a[i] % x != 0 and b[j] % x == 0:
           rezultat.add(b[j])
           j += 1
       elif a[i] < b[j]:
           i += 1
       else:
           j += 1
   while i < len(a) and a[i] % x == 0:
       rezultat.add(a[i])
       i += 1
   while j < len(b) and b[j] % x == 0:
       rezultat.add(b[j])
       j += 1
   return sorted(list(rezultat))

def verificare_restricții(x, a, b):

   if not (0 < x < 1000000):
       return False
   for numar in a + b:
       if numar >= 1000000:
           return False
   return True

def main():

   # Citirea datelor de intrare
   with open("interclasm.in", "r") as file:
       x = int(file.readline().strip())
       n = int(file.readline().strip())
       a = [int(file.readline().strip()) for _ in range(n)]
       m = int(file.readline().strip())
       b = [int(file.readline().strip()) for _ in range(m)]
   # Verificare restricții
   if not verificare_restricții(x, a, b):
       print("Nu au fost respectate cerintele impuse.")
       return
   # Calculul multipliilor lui x care se află doar într-unul dintre șiruri
   rezultat = multiplii_x_unice(x, a, b)
   # Scrierea rezultatului în fișierul de ieșire
   with open("interclasm.out", "w") as file:
       file.write(" ".join(map(str, rezultat)))

if __name__ == "__main__":

   main()

</syntaxhighlight>