Cerința
Se dă șirul lui Fibonacci: \({f}_{1}=1\), \({f}_{2}=1\), \({f}_{3}=2\), \({f}_{4}=3\), \({f}_{5}=5\), …, definit astfel \({f}_{k+2}\) = \({f}_{k+1}\) + \({f}_{k}\), \(k>2\).
Se dau \(Q\) query-uri de forma \(a b\). Se cere să se afișeze pentru fiecare query \({f}_{a}\), \({f}_{b}\) și suma elementelor \({f}_{k}\) din șirul lui Fibonacci cu \(a≤k≤b\).
Date de intrare
Fișierul de intrare fibointerval.in
conține pe prima linie numerele n
si Q
, iar pe următoarele Q
linii câte două numere a
si b
reprezentând query-urile.
Date de ieșire
Fișierul de ieșire fibointerval.out
va conține pe fiecare linie, în ordine, rezultatul celor Q
query-uri, cele 3
valori care trebuie afișate fiind separate prin câte un spațiu.
Restricții și precizări
1 ≤ n ≤ 1000
1 ≤ Q ≤ 10000
1 ≤ a ≤ b ≤ n
Exemplu
fibointerval.in
10 3 1 3 3 5 2 8
fibointerval.out
1 2 4 2 5 10 1 21 53
Explicație
\(n=10\) și \(Q=3\).
Primul query: \(a=1\), \(b=3\), rezultă că \({f}_{1}=1\), \({f}_{3}=2\), iar suma elementelor cu indici cuprinși intre \(a\) și \(b\) este 4
.
Al doilea query: \(a=3\), \(b=5\), rezultă că \({f}_{3}=2\), \({f}_{5}=5\), iar suma elementelor cu indici cuprinși intre \(a\) și \(b\) este 10
.
Al treilea query: \(a=2\), \(b=8\), rezultă că \({f}_{2}=1\), \({f}_{8}=21\), iar suma elementelor cu indici cuprinși intre \(a\) și \(b\) este 53
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema FiboInterval:
#include <bits/stdc++.h>
#define last 220
using namespace std;
ifstream fin ("fibointerval.in");
ofstream fout("fibointerval.out");
short int x[1005][225];
void Fibo (int p){
int i;
for (i=last; i>=1; i--){
x[p][i] += x[p-1][i] + x[p-2][i];
x[p][i-1] += x[p][i] / 10;
x[p][i] %= 10;
}
}
void afisare (int p){
int i;
for (i=1; i<=last; i++)
if (x[p][i])
break;
for (;i<=last; i++)
fout << x[p][i];
fout << " ";
}
int afis[225];
void sumInterval (int a, int b){
int i;
for (i=0; i<=last; i++)
afis[i] = x[b+2][i];
for (i=last; i>=1; i--){
afis[i] -= x[a+1][i];
if (afis[i]<0){
afis[i] += 10;
afis[i-1] --;
}
}
for (i=1; i<=last; i++)
if(afis[i])
break;
for (; i<=last; i++)
fout << afis[i];
fout << "\n";
}
int main()
{
int n, i, Q, q, a, b;
fin >> n >> Q;
x[1][last] = 1;
x[2][last] = 1;
for (i=3; i<=n+2; i++)
Fibo(i);
// for (i=1; i<=n+2; i++)
// afisare(i), fout << "\n";
for (q=1; q<=Q; q++){
fin >> a >> b;
afisare(a);
afisare(b);
sumInterval(a,b);
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #3015 FiboInterval
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3015 FiboInterval de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!