Cod sursa(job #466213)

Utilizator deneoAdrian Craciun deneo Data 26 iunie 2010 12:14:52
Problema Fibo3 Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.06 kb
#include<cstdio>
#include<algorithm>
using namespace std;
long long v[1000];
long long t=1000000000;
void genFibo() // fa preprocesare...mult mai rapid
{
	int i=2;
	v[0]=1; v[1]=1;
	while(v[i-1]<t) // ai grija este micsorata pt. debug constanta
	{
		v[i]=v[i-1]+v[i-2];
		++i;
	}
}

long long calc(long long x1, long long y1, long long x2, long long y2) // cautare binara mai rapid
{
	long long i, p1, p2, sum=0, l, poz;
	for(i=1; v[i]<y1; ++i);
	p1=i;
	for(i=p1; v[i]<=y2+x1; ++i);
	p2=i-1;
	l=y2-p2;
	poz=x1; 
	while(1)
	{
		if(poz+v[p2+1]-v[p2]+l>x2)
		{
			sum+=(x2-poz+1)*(p2-p1+1);
			break;
		}
		else
		{
			sum+=(p2-p1+1)*(v[p2+1]-v[p2]+l);
			l=0;
			++p2;
			poz+=(v[p2+1]-v[p2]+l);
		}
	}
	return sum;
}

int main()
{
	long long n, x1, y1, x2, y2, i;
	freopen("fibo3.in", "rt", stdin);
	freopen("fibo3.out", "wt", stdout);
	scanf("%lld", &n);
	for(i=1; i<=6; ++i)
		t*=10;
	genFibo();
	for(i=1; i<=n; ++i)
	{
		scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
		printf("%lld\n", calc(x1, y1, x2, y2));
	}
	return 0;
}