Cod sursa(job #1019586)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 31 octombrie 2013 16:27:35
Problema Al k-lea termen Fibonacci Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
//#include <iostream>
using namespace std;

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

#define MOD 666013
#define ll long long

#define cout g
ll result;
int nrf;

struct qua
{
   ll a,b,c,d;
};

qua init;

qua mul(qua x1,qua x2)
{
	qua res;
	
	res.a=x1.a*x2.a+x1.b*x2.c;
	res.b=x1.a*x2.b+x1.b*x2.d;
	res.c=x1.c*x2.a+x1.d*x2.c;
	res.d=x1.c*x2.b+x1.d*x2.d;
	
	res.a%=MOD;
	res.b%=MOD;
	res.c%=MOD;
	res.d%=MOD;
	return res;
}

qua lgpow(int P)
{
	if (P==1) return init;
	qua res=mul(lgpow(P/2),lgpow(P/2));
	if (P%2) res=mul(res,init);
	
	return res;
}

int main()
{
	f>>nrf;
	init.a=0;
	init.b=1;
	init.c=1;
	init.d=1;
	--nrf;
	
	if (nrf==0) result=0;
	else
	{
	  if (nrf==1) result=1;
	  else 
	  {
	     qua X=lgpow(nrf-1);
		// cout<<X.a<<" "<<X.b<<'\n'<<X.c<<" "<<X.d<<'\n';
	     result=X.b+X.d;
	  }
	}
	result%=MOD;
	cout<<result<<'\n';
	
	return 0;
}