Cod sursa(job #801856)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 25 octombrie 2012 11:44:44
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<stdio.h>
#include<string.h>

#define MOD 666013

int N;
long long const_mat[3][3], mat[3][3];

void inm_mat(long long a[3][3], long long b[3][3], long long d[3][3]) {
	
	int i, j, k;
	long long c[3][3], val;
	
	val = 0;
	for(i=1; i<=2; i++)
		for(j=1; j<=2; j++) {
			for(k=1; k<=2; k++) 
				val += ((a[i][k] % MOD) * (b[k][j] % MOD)) % MOD;
			c[i][j] = val % MOD;
			val = 0;
		}
	memcpy(d,c,sizeof(c));
}

void put(int p) {
	
	for(; p; p/=2) {
		if(p%2==1) 
			inm_mat(mat,const_mat,mat);
		inm_mat(const_mat,const_mat,const_mat);
	}
}

int main() {
	
	freopen("kfib.in","r",stdin);
	freopen("kfib.out","w",stdout);
	
	int i, j;
	
	const_mat[1][1] = 0;
	const_mat[1][2] = const_mat[2][1] = const_mat[2][2] = 1;
	
	mat[1][1] = mat[2][2] = 1;
	mat[1][2] = mat[2][1] = 0;
	
	scanf("%d",&N);
	put(N-1);
	printf("%d\n",mat[2][2]);
	
	return 0;
}