Cod sursa(job #469160)

Utilizator blasterzMircea Dima blasterz Data 6 iulie 2010 17:03:05
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#define mod 666013
#define lint long long
using namespace std;

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

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

lint A[3][3], B[3][3], C[3][3];
int i, j, k, MAT[3][3], N;

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

void afis (lint a[][3])
{
	for (int i = 0; i < 2; ++i)
	{
		for (int j = 0; j < 2; ++j)
			printf ("%lld ", a[i][j]);
		printf ("\n");
	}	
	printf ("\n\n");
	
}

void lgput(int niv)
{
	int x[64];
	int nx = 0, i;
	int exp = niv;
	while (niv > 0)
		if (niv % 2 == 0)
			x[nx++] = niv,
			niv /= 2;
		else 
			x[nx++] = niv ,
			--niv;
	reverse (x, x + nx);
	
	for (i = 1; i < nx; ++i)
	{
		
		if (x[i] % 2 == 0)
		{
			mul(A, A, C);  
			memcpy(A, C, sizeof(C));
			memset(C, 0, sizeof(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;
	
	N = 2707124;
	lgput(N);
	
	
	//printf ("%lld\n", A[1][0]);
	fout << A[1][0];
	return 0;
}