Cod sursa(job #2020994)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 12 septembrie 2017 15:27:36
Problema Fibo3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <stdlib.h>

#define FMAX 75

inline long long min(long long a, long long b){
    return  a < b ? a : b;
}

long long fib[1 + FMAX];
int main(){
    FILE*fi,*fo;
    fi = fopen("fibo3.in","r");
    fo = fopen("fibo3.out","w");

    fib[0] = 1;
    fib[1] = 1;
    for(int i = 2; i <= 75; i++)
        fib[i] = fib[i - 1] + fib[i - 2];
    //printf("%lld ", fib[75]);
    fib[0] = 0;

    int n;
    fscanf(fi,"%d", &n);
    for(int i = 1; i <= n; i++){
        long long x1, y1, x2, y2;
        fscanf(fi,"%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
        long long plebs = 0;
        long long a1 = x1 + y2, a2 = x2 + y2;
        int j = 0;
        while(fib[j] < a1) j++;
        int k = FMAX;
        while(fib[k] > a2) k--;
        for(int l = j; l <= k; l++){
            long long yb = y2;
            long long xb = fib[l] - yb;
            plebs += min(x2 - xb + 1, y2 - y1 + 1);
        }

        //printf("%d %d\n", j, k);

        a1 = x1 + y1;
        a2 = x1 + y2 - 1;
        j = 0;
        while(fib[j] < a1) j++;
        k = FMAX;
        while(fib[k] > a2) k--;
        for(int l = j; l <= k; l++){
            long long xb = x1;
            long long yb = fib[l] - xb;
            plebs += min(yb - y1 + 1, x2 - x1 + 1);
        }
        if(x1 == 0 && y1 == 0)
            plebs--;
        fprintf(fo,"%lld\n", plebs);
    }

    fclose(fi);
    fclose(fo);
    return 0;
}