Cod sursa(job #381010)

Utilizator FlorianFlorian Marcu Florian Data 8 ianuarie 2010 15:59:55
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
using namespace std;
#include<fstream>
#include<cstring>
#define MOD 666013
int K, rez[4][4], c[4][4];
void mul(int a[][4], int b[][4]) // a = a * b
{
	int r[4][4],i,j,k;
	memset(r,0,sizeof(r));	
	for(i=1; i<=2;++i)
		for(j=1;j<=2;++j)
			for(k=1; k<=2;++k)
				r[i][j] = (r[i][j] + 1LL * a[i][k] * b[k][j]) %MOD;
	for(i=1;i<=2;++i)
		for(j=1;j<=2;++j)
			a[i][j] = r[i][j] % MOD;
}
int main()
{
	ifstream f("kfib.in");
	ofstream g("kfib.out");
	f>>K;
	c[1][1] = 0; c[1][2] = c[2][2] = c[2][1] = 1;
	rez[1][1] = rez[2][2] = 1;
	--K;
	if(K == 0) { g<<"0\n"; return 0; }
	while(K)
	{
		if(K&1)
		{
			--K;
			mul(rez,c);
		}
		else
		{
			K>>=1;
			mul(c,c);
		}
	}
	g<<rez[2][2]<<"\n";
	return 0;
}