3911 - PermPrimPF
Cerința[edit | edit source]
Se dă o mulțime cu n elemente, numere naturale. Afișați în ordine lexicografică toate permutările mulțimii date în care elementele prime sunt puncte fixe (nu își schimbă poziția).
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n și apoi n numere naturale, reprezentând elementele mulțimii.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran permutările cerute, câte una pe fiecare rând și având elementele separate prin câte un spaţiu.
Restricții și precizări[edit | edit source]
- 1 < n ≤ 15
- numărul valorilor prime din șir va fi aproximativ egal cu cel al valorilor neprime
Exemplu 1[edit | edit source]
- Intrare
5
9 7 1 2 8
- Iesire
1 7 8 2 9
1 7 9 2 8
8 7 1 2 9
8 7 9 2 1
9 7 1 2 8
9 7 8 2 1
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> import itertools
def is_prime(num):
if num < 2: return False for i in range(2, int(num**0.5) + 1): if num % i == 0: return False return True
def read_input():
n = int(input().strip()) elements = list(map(int, input().strip().split())) return n, elements
def write_output(permutations):
for perm in permutations: print(" ".join(map(str, perm)))
def generate_permutations(n, elements):
prime_positions = {i: elements[i] for i in range(n) if is_prime(elements[i])} non_prime_elements = [elements[i] for i in range(n) if i not in prime_positions] non_prime_permutations = itertools.permutations(non_prime_elements) permutations = [] for perm in non_prime_permutations: perm_list = list(elements) perm_iter = iter(perm) for i in range(n): if i not in prime_positions: perm_list[i] = next(perm_iter) permutations.append(perm_list) return sorted(permutations)
def main():
n, elements = read_input() if not (1 < n <= 15): raise ValueError("n trebuie să fie între 1 și 15") if not all(isinstance(x, int) and x >= 0 for x in elements): raise ValueError("Toate elementele trebuie să fie numere naturale.") permutations = generate_permutations(n, elements) write_output(permutations)
if __name__ == '__main__':
main()
</syntaxhighlight>