1932 - PC

From Bitnami MediaWiki
Revision as of 09:47, 22 April 2023 by Paul Ungur (talk | contribs) (Pagină nouă: ==Cerința== Gigel vrea un calculator nou care are prețul <span style=“color: red”> x</span>. Tatăl acestuia, fiind profesor de matematica, i-a spus ca îi va cumpăra calculatorul dacă prețul <span style=“color: red”> x</span> al acestuia este norocos. Un număr <span style=“color: red”> x</span> este norocos dacă pătratul acestuia se poate scrie ca sumă de <span style=“color: red”> x</span> numere consecutive. De exemplu, <span style=“color: red”>...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

Gigel vrea un calculator nou care are prețul x. Tatăl acestuia, fiind profesor de matematica, i-a spus ca îi va cumpăra calculatorul dacă prețul x al acestuia este norocos. Un număr x este norocos dacă pătratul acestuia se poate scrie ca sumă de x numere consecutive. De exemplu, x = 7 este număr norocos deoarece, 7 * 7 = 4 + 5 + 6 + 7 + 8 + 9 + 10. Gigel a obţinut T oferte de preț și dorește să știe pentru fiecare dintre acestea dacă prețul este corespunzătar restricției pe care i-a impus-o tatăl său.

Date de intrare

Fișierul de intrare pc.in conține pe prima linie un singur număr natural T, reprezentând numărul de oferte. Pe a doua linie se află T numere naturale x1 x2 x3 … xT separate prin câte un spaţiu, cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire pc.out va conține pe prima linie, separate prin câte un spațiu, cele T răspunsuri, în ordine: 1 dacă oferta este corespunzătoare restricției impuse și 0 în caz contrar.

Restricții și precizări

x < 2.000.000.000 T < 10

Exemplu:

pc.in 3 3 4 7

pc.out 1 0 1

Rezolvare

<syntaxhighlight lang="python" line> def is_lucky(x):

   for n in range(int(x**0.5)):
       if (2*x - n*n + n) % (2*n+2) == 0:
           return True
   return False

def read_input_file(input_file):

   with open(input_file, 'r') as fin:
       T = int(fin.readline())
       x_values = list(map(int, fin.readline().split()))
       
   result = []
   for x in x_values:
       if is_lucky(x):
           result.append(1)
       else:
           result.append(0)
           
   return result

def main(input_file, output_file):

   result = read_input_file(input_file)
   with open(output_file, 'w') as fout:
       fout.write(' '.join(map(str, result)))

</syntaxhighlight>

Explicatie

Pentru a verifica dacă un număr este norocos, trebuie să verificăm toate valorile de n posibile, unde n <= sqrt(x), utilizând formula sumei unei secvențe de numere consecutive. Dacă găsim o astfel de valoare de n, înseamnă că x este norocos. În funcția de intrare citim valorile din fișier și apelăm funcția de validare pentru fiecare valoare, stocând rezultatele într-o listă. În final, scriem rezultatele în fișierul de ieșire.