Cod sursa(job #591022)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 21 mai 2011 18:45:52
Problema Al k-lea termen Fibonacci Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.78 kb
#include <stdio.h>
#include <string.h>

long long z[2][2] = {{0, 1}, {1, 1}};
long long r[2][2] = {{1, 0}, {0, 1}};

long long aux[2][2] = {{0, 0}, {0, 0}};

long long div = 666013;

void multiply(long long (*m1)[2][2], long long m2[2][2])
{
	int i, j, k;

	memset(aux, 0, sizeof(aux));

	for (i = 0; i < 2; i++)
		for (j = 0; j < 2; j++)
			for (k = 0; k < 2; k++)
				aux[i][j] += (*m1)[i][k] * m2[k][j];
	
	for (i = 0; i < 2; i++)
		for (j = 0; j < 2; j++)
			(*m1)[i][j] = aux[i][j] % div;
}

long long kfib(long p)
{
	do
	{
		int b = p % 2;

		if (b)
			multiply(&r, z);

		multiply(&z, z);
		p = p / 2;
	} while (p > 0);

	return r[1][1];
}

int main()
{
	int k;

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

	scanf("%d", &k);

	printf("%lld", kfib(k - 1));

	return 0;
}