Cod sursa(job #726606)

Utilizator mottyMatei-Dan Epure motty Data 27 martie 2012 12:47:45
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>

using namespace std;

ifstream in("kfib.in");
ofstream out("kfib.out");

const int MOD = 666013;
const int N = 2;

int n;
long long m[N][N];
long long p[N][N];

void multiply(long long a[N][N], long long b[N][N]) {
	long long c[N][N];
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j) {
			c[i][j] = 0;

			for (int k = 0; k < N; ++k)
				c[i][j] = (c[i][j] + (a[i][k] * b[k][j])) % MOD;
		}

	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			a[i][j] = c[i][j];
}

void raise() {
	while (n) {
		if (n&1)
			multiply(p, m);

		multiply(m, m);

		n /= 2;
	}
}

int main() {
	in >> n;
	p[0][0] = p[1][1] = 1;
	m[0][1] = m[1][0] = m[1][1] = 1;

	raise();

	out << p[0][1]/* + p[1][1] */<< "\n";
	return 0;
}