3045 - Pro 3
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>