Cod sursa(job #434028)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 aprilie 2010 22:29:39
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#define LMAX 3
#define MOD 666013
#define ll long long
int k,rez[LMAX][LMAX],part[LMAX][LMAX],mat[LMAX][LMAX];
void precompute()
{
	rez[1][1]=0; rez[1][2]=1;
	part[1][1]=1; part[2][2]=1;
	mat[1][2]=1; mat[2][1]=1; mat[2][2]=1;
}
void mul(int A[][LMAX],int B[][LMAX])
{
	int i,j,k,C[LMAX][LMAX];
	ll p;
	for (i=1; i<=2; i++)
		for (j=1; j<=2; j++)
		{
			p=0;
			for (k=1; k<=2; k++)
				p+=(ll)A[i][k]*B[k][j];
			if (p>=MOD)
				p%=MOD;
			C[i][j]=p;
		}
	for (i=1; i<=2; i++)
		for (j=1; j<=2; j++)
			A[i][j]=C[i][j];
}
void lgput()
{
	while (k)
	{
		if (k & 1)
			mul(part,mat);
		mul(mat,mat);
		k>>=1;
	}
}
int main()
{
	freopen("kfib.in","r",stdin);
	freopen("kfib.out","w",stdout);
	scanf("%d",&k);
	precompute();
	lgput();
	mul(rez,part);
	printf("%d\n",rez[1][1]);
	return 0;
}