2793 - Pozitii consecutive

De la Universitas MediaWiki

Cerință

Considerăm următorul șir, în care n este un număr natural nenul:
fn = 0, daca n=1
fn = 3, daca n=2
fn = 2⋅fn−1–fn−2+2, dacă n>2.

Primii termeni ai acestui șir sunt: 0, 3, 8, 15, 24, 35, 48, 63, 80 ....

Se citesc două numere naturale din intervalul [0,109], x și y, reprezentând valorile a doi termeni aflați pe poziții consecutive în șirul dat (x<y), și se cere să se afișeze, în ordine strict descrescătoare, separați prin câte un spațiu, toţi termenii șirului mai mici sau egali cu y.

Date de intrare

Fișierul de intrare pozitiiconsecutive.in conține pe prima linie numerele x y.

Date de ieșire

Fișierul de ieșire pozitiiconsecutive.out va conține pe prima linie în ordine strict descrescătoare, separați prin câte un spațiu, toţi termenii șirului mai mici sau egali cu y.

Restricții și precizări

Pentru determinarea și afișarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al spațiului de memorie și al timpului de executare; se recomandă evitarea memorării numerelor într-un tablou sau în altă structură de date similară n∈[1,10 9 ]

Exemplu

Date de intrare: pozitiiconsecutive.in : 48 63
Date de ieșire: pozitiiconsecutive.out : 63 48 35 24 15 8 3 0

Rezolvare

if __name__ == "__main__":
    citire_fisier = open("pozitiiconsecutive.in" , "r")
    scriere_fisier = open("pozitiiconsecutive.out" , "w")
    x = int(citire_fisier.readline().strip())
    y = int(citire_fisier.readline().strip())
    z = 9
    scriere_fisier.write(str(y))
    scriere_fisier.write(' ')
    scriere_fisier.write(str(x))
    scriere_fisier.write(' ')
    while(z > 8):
        z = 2 * x - y + 2
        scriere_fisier.write(str(z))
        scriere_fisier.write(' ')
        y = x
        x = z
    scriere_fisier.write('3')
    scriere_fisier.write(' ')
    scriere_fisier.write('0')