Pagini recente » Cod sursa (job #2349181) | Cod sursa (job #1102881) | Cod sursa (job #2733251) | Cod sursa (job #49759) | Cod sursa (job #1587131)
/*
Solutie Dani Mocanu O(-1)
sol += min() - max() + 1
lucram cu abscise, in min() fixam abscisa pctului de intersectie dintre dreapta Fib[i] si cel mai la dreapta-jos pct din dreptunghi
in max() fixam abscisa pctului de intersectie dintre dreapta Fib[i] si cel mai la stanga-sus pct din dreptunghi
dreapta fib[i] = toate perechile (x,y) care x+y = fib[i]
dupa ce avem cele doua abscise fixate, facem diferenta si adaugam 1 PTR CA E INTERVAL INCHIS evident wtf
grije ca fib[i] sa se intersecteze cu dreptunghiu, altfel faci balarii
nu vad dinamica
*/
#include <fstream>
using namespace std;
const int BFSIZE = 1<<18;
char S[BFSIZE], *p, O[2000000], *o;
inline long long Get();
inline void Check();
ifstream is ("fibo3.in");
ofstream os ("fibo3.out");
long long A, B, C, D, N;
long long Fib[94];
inline void CheatOutput(long long X);
int main()
{
p = S;
o = O;
Fib[0] = Fib[1] = 1;
for (int i = 2; i < 94; ++i)
Fib[i] = Fib[i-1] + Fib[i-2];
N = Get();
int i;
for (long long Sol; N; --N)
{
A = Get(); B = Get(); C = Get(); D = Get();
for (i = 1; Fib[i] < A+B; ++i);
for (Sol = 0; Fib[i] <= C+D; ++i)
Sol += (min(C, Fib[i]-B) - max(A, Fib[i]-D) + 1);
CheatOutput(Sol);
}
os << O;
is.close();
os.close();
}
inline long long Get()
{
while (*p < '0' || '9' < *p) ++p, Check();
long long X = 0;
while ('0' <= *p && *p <= '9') X = X * 10 + (*p-'0'), ++p, Check();
return X;
};
inline void Check()
{
if (*p == '\0') is.get(S, BFSIZE, '\0'), p = S;
};
inline void CheatOutput(long long X)
{
long long Y = 0;
for (;X; X /= 10)
Y = Y*10 + X%10;
for (;Y; Y/= 10, ++o)
*o = (Y%10) + '0';
*o = '\n'; ++o;
};