Pagini recente » Cod sursa (job #56173) | Cod sursa (job #3231658) | Cod sursa (job #2426822) | Cod sursa (job #2409225) | Cod sursa (job #466391)
Cod sursa(job #466391)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long fib[100];
long long x1, y1, x2, y2;
int n;
void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
long long startPosition = x1 + y1;
long long stopPosition = x2 + y1;
int pozFirst = 0, pozLast = 0;
long long firstElement = 0, lastElement = 0;
for (int j = 1; j < 100; j++)
if (fib[j] >= startPosition) {
firstElement = fib[j];
pozFirst = j;
break;
}
for (int j = 1; j < 100; j++)
if (fib[j] > startPosition + (y2 - y1)) {
lastElement = fib[j];
pozLast = j;
break;
}
long long retValue = 0, Sum = pozLast - pozFirst;
while (startPosition <= stopPosition) {
long long firstEvent = firstElement - startPosition + 1;
long long secondEvent = lastElement - startPosition - (y2 - y1);
long long thirdEvent = stopPosition - startPosition + 1;
if (thirdEvent < min(firstEvent, secondEvent)) {
retValue += 1LL * thirdEvent * Sum;
startPosition += thirdEvent;
}
else {
long long EvMin = min(firstEvent, secondEvent);
retValue += EvMin * Sum;
if (firstEvent == EvMin) {
pozFirst++;
firstElement = fib[pozFirst];
Sum--;
}
if (secondEvent == EvMin) {
pozLast++;
lastElement = fib[pozLast];
Sum++;
}
startPosition += EvMin;
}
}
printf("%lld\n", retValue);
}
}
int main() {
fib[0] = fib[1] = 1;
for (int i = 2; i < 100; i++)
fib[i] = fib[i - 2] + fib[i - 1];
freopen("fibo3.in", "r", stdin);
freopen("fibo3.out", "w", stdout);
solve();
return 0;
}