Cod sursa(job #2465154)

Utilizator mvcl3Marian Iacob mvcl3 Data 29 septembrie 2019 15:26:00
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#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;
}