Cod sursa(job #808317)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 6 noiembrie 2012 17:11:04
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 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])%MOD;
}

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