Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 179 si 180 | Diferente pentru implica-te/arhiva-educationala intre reviziile 190 si 191 | Cod sursa (job #2243018) | Cod sursa (job #93956) | Cod sursa (job #3298914)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
int R[3][3],solutie[3][3];
void inmultire_matrice(int A[][3],int B[][3],int C[][3])
{
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for (k = 0; k < 2; k++)
C[i][j]=(C[i][j]+(1LL*A[i][k]*B[k][j]))% 666013;
}
void functie_logaritmica(int M[][3],int P)
{
int C[3][3],temp[3][3];
M[0][0]=M[1][1]=1;
C[0][0]=0;
C[0][1] = 1;
C[1][0] = 1;
C[1][1] = 1;
while (P>0) {
if (P%2==1) {
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
temp[i][j]=0;
inmultire_matrice(M, C, temp);
M[0][0] = temp[0][0];
M[0][1] = temp[0][1];
M[1][0] = temp[1][0];
M[1][1] = temp[1][1];
}
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
temp[i][j]=0;
inmultire_matrice(C, C, temp);
C[0][0] = temp[0][0];
C[0][1] = temp[0][1];
C[1][0] = temp[1][0];
C[1][1] = temp[1][1];
P /= 2;
}
}
int main()
{
int K;
fin>>K;
R[0][0]=0;
R[0][1]=1;
R[1][0]=1;
R[1][1]=1;
functie_logaritmica(solutie,K-1);
fout<<solutie[1][1];
fin.close();
fout.close();
}