Pagini recente » Diferente pentru utilizator/ene_orlando_georgian_321cb intre reviziile 2 si 4 | Statistici vladimir manescu (vladimir1413) | Istoria paginii utilizator/marcosanu_rafael | Cod sursa (job #1520482) | Cod sursa (job #3136139)
#include <bits/stdc++.h>
#include <fstream>
#define N 2
using namespace std;
ifstream in("kfib.in");
ofstream out("kfib.out");
void inmultireMatrice (long long int A[N][N], long long int B[N][N], long long int C[N][N])
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
C[i][j] = 0;
for (int k = 0; k < N; k++)
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % 666013;
}
}
void power (long long int F[N][N], int exp)
{
if (exp <= 1)
return;
long long int matConst[N][N];
matConst[0][0] = 0;
matConst[0][1] = 1;
matConst[1][0] = 1;
matConst[1][1] = 1;
long long int aux[N][N];
while (exp > 0)
{
if (exp % 2 == 1)
{
inmultireMatrice(F,matConst,aux);
for (int i = 0; i < N; i++)
for (int j = 0; j< N; j++)
{
F[i][j] = aux[i][j];
cout << F[i][j] << ' ';
}
cout << '\n';
}
inmultireMatrice(matConst, matConst, aux);
for (int i = 0; i < N; i++)
for (int j = 0; j< N; j++)
{
matConst[i][j] = aux[i][j];
cout << F[i][j] << ' ';
}
cout << '\n';
exp = exp / 2;
}
}
int termenFibinacci (int k)
{
if (k==0)
return 0;
long long int matConst[N][N];
matConst[0][0] = 0;
matConst[0][1] = 1;
matConst[1][0] = 1;
matConst[1][1] = 1;
power (matConst, k-1);
return matConst[1][0];
}
int main ()
{
int k;
long long int kTermen;
in >> k;
kTermen = termenFibinacci(k);
out << kTermen;
return 0;
}