Cod sursa(job #808312)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 6 noiembrie 2012 17:08:20
Problema Al k-lea termen Fibonacci Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>

using namespace std;

ifstream in("kfib.in");
ofstream out("kfib.out");

const int MOD=666013;

long long reccurence[2][2]={{1,1},
			 {1,0}};

void multmat(long long a[2][2],long long b[2][2]){ // a=a*b;
	long long c[2][2];
	c[0][0]=(a[0][0]*b[0][0])%MOD+(a[0][1]*b[1][0])%MOD;
	c[0][1]=(a[0][0]*b[0][1])%MOD+(a[0][1]*b[1][1])%MOD;
	c[1][0]=(a[1][0]*b[0][0])%MOD+(a[1][1]*b[1][0])%MOD;
	c[1][1]=(a[1][0]*b[0][1])%MOD+(a[1][1]*b[1][1])%MOD;
	a[0][0]=c[0][0]%MOD;
	a[1][1]=c[1][1]%MOD;
	a[1][0]=c[1][0]%MOD;
	a[0][1]=c[0][1]%MOD;
}


long long Kfib(int k){
	long long result[2][2]={{1,0},
			     {0,1}};
	while(k){
		if(k&1){
			multmat(result,reccurence);
		}
		multmat(reccurence,reccurence);
		k>>=1;
	}
	return result[0][1]+result[0][0];
}

int main(){
	int k;
	in>>k;
	k-=2;
	out<<Kfib(k);
	return 0;
}