3045 - Pro 3

From Bitnami MediaWiki

Se consideră 3 progresii aritmetice de numere naturale nenule. Notăm cu Pi, 1 ≤ i ≤ 3, mulțimile formate cu elementele progresiei i. Fie P = P1  P2  P3 reuniunea mulțimilor P1, P2, P3.

Cerința[edit | edit source]

Să se determine cardinalul mulțimii P.

Date de intrare[edit | edit source]

Fișierul de intrare input.txt conține 3 linii. Pe linia i, 1 ≤ i ≤ 3 se vor găsi câte trei numere naturale ai, ri, ni, separate prin câte un spațiu, ce reprezintă în această ordine primul termen, rația și numărul de termeni ai progresiei Pi.

Date de ieșire[edit | edit source]

Fișierul de ieșire output.txt va conține pe prima linie cardinalul mulțimii P.

Exemplu[edit | edit source]

input.txt:

2 2 10

3 4 8

1 3 12

output.txt:

24

Explicație:

Prima progresie are primul termen 2, rația 2 și 10 termeni.

A doua progresie are primul termen 3, rația 4 și 8 termeni.

A treia progresie are primul termen 1, rația 3 și 12 termeni.

Așadar:

P1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

P2 = {3, 7, 11, 15, 19, 23, 27, 31}

P3 = {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34}

Reuniunea termenilor celor trei progresii este mulțimea

P = {1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 23, 25, 27, 28, 31, 34} și cardinalul mulțimii P este 24.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> class Progresie:

   def __init__(self, first, ratio, n):
       self.first = first
       self.ratio = ratio
       self.n = n

def read():

   with open("input.txt", "r") as f:
       x_values = list(map(int, f.readline().split()))
       y_values = list(map(int, f.readline().split()))
       z_values = list(map(int, f.readline().split()))
   
   return Progresie(*x_values), Progresie(*y_values), Progresie(*z_values)

def cmmdc(a, b):

   while b != 0:
       a, b = b, a % b
   return a

def cmmmc(a, b):

   return a * b // cmmdc(a, b)

def calc(a, b):

   Maxa = a.first + a.ratio * (a.n - 1)
   Maxb = b.first + b.ratio * (b.n - 1)
   Min = min(Maxa, Maxb)
   for i in range(int(1e6)):
       nr = a.first + i * a.ratio
       if nr >= b.first and nr <= Min and (nr - b.first) % b.ratio == 0:
           return Progresie(nr, cmmmc(a.ratio, b.ratio), (Min - nr) // cmmmc(a.ratio, b.ratio) + 1)
   return Progresie(0, 0, 0)

def solve(x, y, z):

   xy = calc(x, y)
   xz = calc(x, z)
   yz = calc(y, z)
   xyz = calc(xy, z)
   return x.n + y.n + z.n - xy.n - xz.n - yz.n + xyz.n

def output(rez):

   with open("output.txt", "w") as g:
       g.write(str(rez))

if __name__ == "__main__":

   x, y, z = read()
   rez = solve(x, y, z)
   output(rez)

</syntaxhighlight>