2597 - PermutarePow: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == Fie '''∆''' o permutare de gradul '''n'''. Se cere să se calculeze perioada principală a funcției '''f(x)''' = '''∆^x'''. == Date de intrare == Fișierul de intrare '''permutarepowin.txt''' conține pe prima linie numărul '''n''', iar pe a doua linie '''n''' numere naturale distincte separate prin spații, reprezentând valorile permutării '''∆'''. == Date de ieșire == Fișierul de ieșire '''permutarepowout.txt''' va conține pe prima linie număru...
 
No edit summary
 
Line 67: Line 67:
     fisier_intrare = open("permutarepowin.txt", "r")
     fisier_intrare = open("permutarepowin.txt", "r")
     fisier_iesire = open("permutarepowout.txt", "w")
     fisier_iesire = open("permutarepowout.txt", "w")
    try:
        n = int(fisier_intrare.readline())
        permutare = list(map(int, fisier_intrare.readline().split()))
        validare(permutare)                # apelul functiei de validare
        p_curent = perioada_principala(permutare)  # apelul functiei de rezolvare
        fisier_iesire.write(str(p_curent))
    except ValueError:
        fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 18:55, 28 December 2023

Cerința[edit]

Fie o permutare de gradul n. Se cere să se calculeze perioada principală a funcției f(x) = ∆^x.

Date de intrare[edit]

Fișierul de intrare permutarepowin.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale distincte separate prin spații, reprezentând valorile permutării .

Date de ieșire[edit]

Fișierul de ieșire permutarepowout.txt va conține pe prima linie numărul P, reprezentând perioada principală a funcției f.

Restricții și precizări[edit]

  • 1 ≤ n ≤ 1.000.000
  • Numerele de pe a doua linie vor aparține intervalului [1,n]
  • Despre permutări

Exemplul 1[edit]

permutarepowin.txt
4
3 4 2 1
permutarepowout.txt
Datele introduse corespund restricțiilor impuse.
4

Explicație[edit]

Se observă că = ∆^5, deci perioada principală este 4.

Exemplul 2[edit]

permutarepowin.txt
5
1 2 3 4 6
permutarepowout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit]

<syntaxhighlight lang="python" line="1">

  1. 2597 - PermutarePow

import math


def validare(permutare_intrare): # functia de validare a datelor de intrare

   n_intrare = len(permutare_intrare)
   if n_intrare < 1 or n_intrare > 1000000:
       raise ValueError
   for numar in permutare_intrare:
       if numar < 1 or numar > n_intrare:    # fiecare numar trebuie sa fie intre 1 si n
           raise ValueError
   fisier_iesire.write("Datele introduse corespund restrictiilor impuse.\n")


def perioada_principala(permutare_intrare):

   n_intrare = len(permutare_intrare)
   vizitat = [False] * n_intrare
   cicluri = []
   for i in range(n_intrare):
       if not vizitat[i]:
           ciclu = 0
           j = i
           while not vizitat[j]:
               vizitat[j] = True
               ciclu += 1
               j = permutare_intrare[j] - 1
           cicluri.append(ciclu)
   p_curent_local = cicluri[0]
   for i in range(1, len(cicluri)):
       p_curent_local = (p_curent_local * cicluri[i]) // math.gcd(p_curent_local, cicluri[i])
   return p_curent_local


if __name__ == '__main__':

   fisier_intrare = open("permutarepowin.txt", "r")
   fisier_iesire = open("permutarepowout.txt", "w")
   try:
       n = int(fisier_intrare.readline())
       permutare = list(map(int, fisier_intrare.readline().split()))
       validare(permutare)                 # apelul functiei de validare
       p_curent = perioada_principala(permutare)  # apelul functiei de rezolvare
       fisier_iesire.write(str(p_curent))
   except ValueError:
       fisier_iesire.write("Datele introduse nu corespund restrictiilor impuse.")

</syntaxhighlight>