fbpx

Problema #3015 – FiboInterval – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă șirul lui Fibonacci: f1=1f1=1, f2=1f2=1, f3=2f3=2, f4=3f4=3, f5=5f5=5, …, definit astfel fk+2fk+2 = fk+1fk+1 + fkfk, k>2k>2.

Se dau QQ query-uri de forma abab. Se cere să se afișeze pentru fiecare query fafa, fbfb și suma elementelor fkfk din șirul lui Fibonacci cu akbakb.

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

este 53.

#include <bits/stdc++.h>


using namespace std;

ifstream cin("fibointerval.in");
ofstream cout("fibointerval.out");

struct poz
{
    int n;
    char C[1001];
}F[1005];

int n , k , a , b;

poz aduna(poz a , poz b)
{
    poz s = {0 , {0}};
    s.n = a.n;
    int t = 0;
    for(int i = 1 ; i <= a.n ; i++)
    {
        int c = a.C[i] + b.C[i] + t;
        s.C[i] = c % 10;
        t = c / 10;
    }
    if(t > 0)
    {
        s.n++;
        s.C[s.n] = t;
    }
    return s;
}


poz scade(poz a , poz b)
{
    int t = 0;
    for(int i = 1 ; i <= a.n ; i++)
    {
        int c = a.C[i] - b.C[i] + t;
        if(c < 0)
        {
            a.C[i] = 10 + c;
            t = -1;
        }
        else
        {
            a.C[i] = c;
            t = 0;
        }
    }
    while(a.C[a.n] == 0) a.n--;
    return a;
}

void afisare(poz a)
{
    for(int i = a.n ; i >= 1 ; i--)
        cout << (int)a.C[i];
}

int main()
{
    cin >> k >> n;
    F[1] = {1 , {0 , 1}};
    F[2] = {1 , {0 , 1}};
    for(int i = 3 ; i <= k +2; i++)
        F[i] = aduna(F[i - 1] , F[i - 2]);
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> a >> b;
        afisare(F[a]);
        cout << " ";
        afisare(F[b]);
        cout << " ";
        afisare(scade(F[b + 2] , F[a + 1]));
        cout << '\n';
    }
}
Comentarii

S-ar putea sa iti placa