Cod sursa(job #1324791)

Utilizator diana97Diana Ghinea diana97 Data 22 ianuarie 2015 20:00:27
Problema Fibo3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f ("fibo3.in");
ofstream g ("fibo3.out");

const int NMAX = 100000 + 1;
const long long LMAX = 2000000000000000LL;

int n;
int nr_fib;
vector <long long> fib;

void preproceseaza() {
    fib.push_back(1);
    fib.push_back(1);
    int nr = 1;
    while (fib[nr] <= LMAX) {
        nr++;
        fib.push_back(fib[nr - 2] + fib[nr - 1]);
        //cout << nr << ' ' << fib[nr] << endl;
    }
    nr_fib = nr;
}

long long cauta(long long x) {
    if (x <= 1) return 1;
    long long st = 1, dr = nr_fib, m, sol = -1;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (fib[m] < x) {
            sol = m + 1;
            st = m + 1;
        }
        else dr = m - 1;
    }
    return sol;
}

void rezolva() {
    long long a, b, c, d;
    for (int i = 1; i <= n; i++) {
        f >> a >> b >> c >> d;
        int j = 1;
        long long rez = 0;
        //while (fib[j] < a + b) j++;
        j = cauta(a + b);
        while (fib[j] <= c + d) {
            rez += min(c, fib[j] - b) - max(a, fib[j] - d) + 1;
            j++;
        }
        g << rez << '\n';
    }
}

int main() {
    preproceseaza();
    f >> n;
    rezolva();
}