Cod sursa(job #764204)

Utilizator ioana26Ioana Andronescu ioana26 Data 4 iulie 2012 13:27:59
Problema Al k-lea termen Fibonacci Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
/*
Al k-ulea termen Fibonacci - folosind inmultirea matricilor.
*/

#include <stdio.h>
#include <stdlib.h>

#define MOD		666013

long long z[2][2], m[2][2];

void fibo_mat (long long m[2][2], long long mat[2][2]) {
	long long f[2][2];
	f[0][0] = (m[0][0] * mat[0][0] + m[0][1] * mat[1][0]) % MOD;
	f[0][1] = (m[0][0] * mat[0][1] + m[0][1] * mat[1][1]) % MOD;
	f[1][0] = (m[1][0] * mat[0][0] + m[1][1] * mat[1][0]) % MOD;
	f[1][1] = (m[1][0] * mat[0][1] + m[1][1] * mat[1][1]) % MOD;
	int i, j;
	for (i = 0; i < 2; i++)
		for (j = 0; j < 2; j++)
			m[i][j] = f[i][j] % MOD;
}

void fibo_putere_log (int k) {
	if (k > 1) {
		fibo_putere_log(k / 2);
		fibo_mat(m, m);
		if (k % 2) 
			fibo_mat(m, z);
	}
} 

int main () {
	freopen("kfib.in", "r", stdin);
	freopen("kfib.out", "w", stdout);

	int k;
	scanf("%d", &k);
	
	z[0][0] = 0;
	z[0][1] = z[1][0] = z[1][1] = 1;

	m[0][0] = 0;
	m[0][1] = m[1][0] = m[1][1] = 1;

	fibo_putere_log(k + 1);

	printf("%lld\n", m[0][0]);	

	return 0;
}