Cod sursa(job #466229)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 26 iunie 2010 12:22:48
Problema Fibo3 Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.44 kb
#include<cstdio>
long long rez,x1,y1,x2,y2,n,p1,p2,q1,q2,nr1,nr2,t1,t2,poz,nrfib,fib[1000];
void getfibos()
{
    long long MAX=2;
    for(int i=1;i<=15;i++)
        MAX*=(long long)10;
    fib[0]=fib[1]=1;
    nrfib=1;
    while(fib[nrfib]+fib[nrfib-1]<=MAX)
    {
        nrfib++;
        fib[nrfib]=fib[nrfib-1]+fib[nrfib-2];
    }
}
long long cautb(long long x)
{
    long long i=0,pas=1<<10;
    for(i=0;pas;pas>>=1)
        if(i+pas<=nrfib)
            if(fib[i+pas]<=x)
                i+=pas;
    return i;
}
long long maxim(long long a,long long b)
{
    return a>b?a:b;
}
long long minim(long long a,long long b)
{
    return a<b?a:b;
}
int main()
{
    freopen("fibo3.in","r",stdin);
    freopen("fibo3.out","w",stdout);
    scanf("%lld",&n);
    getfibos();
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
        poz=cautb(x2+y2);
        rez=0;
        for(int j=1;j<=poz;j++)
        {
            p1=maxim(x1,0);
            p2=minim(x2,fib[j]);
            if(p2>=p1)
            {
                nr1=p2-p1+1;
                q1=fib[j]-p1;
                q2=fib[j]-p2;
                t1=maxim(y1,q2);
                t2=minim(y2,q1);
                if(t2>=t1)
                {
                    nr2=t2-t1+1;
                    rez+=(long long)minim(nr1,nr2);
                }
            }
        }
        printf("%lld\n",rez);
    }
    return 0;
}