Cod sursa(job #469164)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 6 iulie 2010 17:25:57
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#define mod 666013

using namespace std;

const char iname[] = "kfib.in";
const char oname[] = "kfib.out";

ifstream fin(iname);
ofstream fout(oname);

long long A[3][3], B[3][3], C[3][3], i, j, k, MAT[3][3], N;
long long v[20000], x[20000], l;

void mul(long long A[3][3], long long B[3][3], long long C[3][3])
{	
	
	int i, j, k;
	
	for(i = 0; i < 2; i ++)
		for(j = 0; j < 2; j ++)
			for(k = 0; k < 2; k ++)
				C[i][j] = (C[i][j] + (long long)(A[i][k] * B[k][j])) % mod;
}

void lgput(long long int niv)
{
	int exp = niv;
	int k = 0;
	//v[k ++] = exp;
	while(exp > 0)
		if(exp % 2 == 0)
		{
			v[k ++] = exp;
			exp = exp / 2;  
		}
		else
		{
			v[k ++] = exp;
			exp --;
		}
	reverse(v, v + k);
	
	for(i = 1; i < k; i ++)
	{
		if(v[i] % 2 == 0 )
			
			mul(A, A, C);
		else
			mul(A, B, C);
		memcpy(A, C, sizeof(C));
		memset(C, 0, sizeof(C));
	}
			
}
int main()
{
	fin >> N;
	A[0][0] = 0, A[1][0] = 1, A[0][1] = 1, A[1][1] = 1;
	B[0][0] = 0, B[1][0] = 1, B[0][1] = 1, B[1][1] = 1;
	lgput(N);
	
	fout << A[1][0];
	return 0;
}