1327 - SirPIE
Cerinţa[edit | edit source]
Se citeşte un număr natural nenul n
, apoi n
numere naturale distincte. Să se afişeze, în ordine lexicografică, șirurile din cele n
valori cu proprietatea că oricare două valori învecinate sunt prime între ele.
Date de intrare[edit | edit source]
Fişierul de intrare sirpieIN.txt
conţine pe prima linie numărul n
, iar pe a doua linie n
numere naturale.
Date de ieşire[edit | edit source]
Fişierul de ieşire sirpieOUT.txt
va conţine pe fiecare linie elementele unei șir, separate prin câte un spaţiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
Restricţii şi precizări[edit | edit source]
1 ≤ n < 10
- cele
n
numere de pe a doua linie a fişierului de intrare sunt mai mici decât10000
Exemplul 1:[edit | edit source]
sirpieIN.txt
4 8 6 7 9
sirpieOUT.txt
6 7 8 9 6 7 9 8 8 9 7 6 9 8 7 6
Exemplul 2:[edit | edit source]
sirpieIN.txt
11 8 6 7 9
sirpieOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def check_constraints(n, v, fout):
if not (1 <= n < 10): fout.write("Datele nu corespund restrictiilor impuse\n") return False
for num in v: if not (1 <= num < 10000): fout.write("Datele nu corespund restrictiilor impuse\n") return False
return True
def gcd(a, b):
while b: a, b = b, a % b return a
def afisare_sol(sol, fout):
fout.write(" ".join(map(str, sol)) + "\n")
def back(k, prev, fout):
if k == n: afisare_sol(sol, fout) else: for i in range(n): if not folosit[i] and gcd(v[i], prev) == 1: sol[k] = v[i] folosit[i] = True back(k + 1, v[i], fout) folosit[i] = False
if __name__ == "__main__":
with open("sirpieIN.txt", "r") as fin, open("sirpieOUT.txt", "w") as fout: n = int(fin.readline().strip()) v = list(map(int, fin.readline().split()))
if not check_constraints(n, v, fout): # Exit if constraints are not met exit()
sol = [0] * n folosit = [False] * n
# Sorting v.sort()
back(0, 1, fout)
</syntaxhighlight>