Cerința
Se consideră șirul 1
, -1
, 2
… definit astfel: f1=1, f2=−1, iar fn=1−2⋅fn−1−fn−2, dacă n≥3
(unde n
este un număr natural).
Se citește un număr natural, n
(n∈[1,10
6
]
), și se cere să se afișeze, separați prin câte un spațiu, primii n
termeni ai șirului, în ordine inversă apariției lor în acesta.
Date de intrare
Fișierul de intrare sir11.in
conține pe prima linie numărul n
.
Date de ieșire
Fișierul de ieșire sir11.out
va conține pe prima linie, separați prin câte un spațiu, primii n
termeni ai șirului, în ordine inversă apariției lor în acesta.
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 enunțul original,
n∈[1,10
9
]
; datorită dimensiunilor fișierelor obținute, limita maximă a luin
a fost redusă;
Exemplu
sir11.in
3
sir11.out
2 -1 1
#include <bits/stdc++.h> using namespace std; ifstream cin("sir11.in"); ofstream cout("sir11.out"); int main() { int n; cin >> n; int f1 = 1, f2 = -1, f3; for(int i = 3; i <= n; ++i) { f3 = 1 - 2 * f2 - f1; if(i != n) {f1=f2; f2=f3;} } for(int i = n; i >= 3; --i) { cout << f3<< ' '; f1 = 1 - 2 * f2 - f3; f3 = f2; f2 = f1; } cout << -1 << ' ' << 1; }