Pagini recente » Cod sursa (job #544574) | Cod sursa (job #678441) | Cod sursa (job #1598036) | Cod sursa (job #2503464) | Cod sursa (job #2465154)
#include<iostream>
#include<fstream>
class Fibonaci {
public:
Fibonaci() {
m_q[0][0] = m_q[0][1] = m_q[1][0] = m_q[1][1] = 0;
}
static long long getFibonaci(long long nth) {
Fibonaci fib;
fib.initFibonaci();
Fibonaci sol;
sol.initIdentity();
for (long long i = 0; (1 << i) <= nth; ++i) {
if ((1 << i) & nth) {
sol = sol * fib;
}
fib = fib * fib;
}
return sol.m_q[0][0] % MODULO;
}
static const long long MODULO = 1000000007;
private:
void initFibonaci() {
m_q[0][0] = m_q[0][1] = m_q[1][0] = 1;
m_q[1][1] = 0;
}
void initIdentity() {
m_q[0][0] = m_q[1][1] = 1;
m_q[0][1] = m_q[1][0] = 0;
}
Fibonaci operator*(const Fibonaci& f) {
Fibonaci fib;
for (long long k = 0; k < 2; ++k) {
for (long long i = 0; i < 2; ++i) {
for (long long j = 0; j < 2; ++j) {
fib.m_q[i][j] += (this->m_q[i][k] * f.m_q[k][j]) % MODULO;
fib.m_q[i][j] %= MODULO;
}
}
}
return std::move(fib);
}
long long m_q[2][2];
};
int main() {
std::ifstream in("fibsum.in");
std::ofstream out("fibsum.out");
long long t, left, right;
in >> t;
while (t--) {
in >> left >> right;
out << (Fibonaci::getFibonaci(right + 2) + Fibonaci::MODULO - Fibonaci::getFibonaci(left + 1)) % Fibonaci::MODULO << std::endl;
}
return 0;
}