Cod sursa(job #1035594)

Utilizator roby2001Sirius roby2001 Data 18 noiembrie 2013 18:03:33
Problema Al k-lea termen Fibonacci Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
/*
          ~Keep It Simple!~
*/

#define modil 666013

#include <stdio.h>
#include <string.h>

long long n,A[3][3],B[3][3],aux[3][3];

void Multiply(long long a[3][3],long long b[3][3])
{
	memset(aux,0,sizeof(aux));
	  for(int i=1;i<=2;i++)
		  for(int j=1;j<=2;j++)
			 for(int k=1;k<=2;k++)
				 aux[i][j]+= (1LL*a[i][k]*b[k][j])%modil;
	  for(int i=1;i<=2;i++)
		  for(int j=1;j<=2;j++)
			  a[i][j] = aux[i][j];
}
void Pow(long long k)
{
	memcpy(B,A,sizeof(A));
	while(k)
	{
		if(k%2)
		{
			Multiply(B,A);
			k--;
		}
		Multiply(A,A);
		k/=2;
	}

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

    scanf("%lld",&n);
	A[1][1] = 0;
	A[1][2] = A[2][2] = A [2][1] = 1;
	Pow(n-2);
	printf("%lld",B[2][2]);
}