Cod sursa(job #2763145)

Utilizator mafiotxrobeert mafiotx Data 11 iulie 2021 21:22:53
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <algorithm> 
#include <cstring>

using namespace std;

string NumeFisier = "kfib";
ifstream fin(NumeFisier + ".in");
ofstream fout(NumeFisier + ".out");

typedef unsigned long long int ull;
typedef  long long int ll;

const ll MOD = 666013;
ll Rez[3][3] = { {0,0,0},
			      {0,1,1},
				  {0,1,0}
};

void MatrixProduct(ll C[][3], ll A[][3], ll B[][3])
{
	//C = A * B;

	for (int i = 1; i <= 2; i++)
		for (int j = 1; j <= 2; j++)
			for (int k = 1; k <= 2; k++)
				C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
}

void Cpy(ll A[][3], ll B[][3])
{
	// A <- B
	for (int i = 1; i <= 2; i++)
		for (int j = 1; j <= 2; j++)
			A[i][j] = B[i][j];

}

void Empty(ll A[][3])
{
	for (int i = 1; i <= 2; i++)
		for (int j = 1; j <= 2; j++)
			A[i][j] = 0;
}


void FastExpo(int exp)
{
	ll Aux1[3][3];
	ll Aux2[3][3];
	ll Baza[3][3];
	Cpy(Baza, Rez);

	while (exp)
	{
		if (exp % 2 == 1)
		{
			Cpy(Aux1, Baza);
			Cpy(Aux2, Rez);
			Empty(Rez);
			MatrixProduct(Rez, Aux1, Aux2);

		}
		Cpy(Aux1, Baza);
		Empty(Baza);
		MatrixProduct(Baza, Aux1, Aux1);
		exp /= 2;
	}
}


int main()
{
	ll n;
	fin >> n;
	FastExpo(n - 2);
	fout << Rez[1][1];
}