Pagini recente » Cod sursa (job #1727381) | Cod sursa (job #2247727) | Cod sursa (job #1727382) | Monitorul de evaluare | Cod sursa (job #3357330)
#include <stdio.h>
#define MOD 666013
// structura pentru matrice
typedef struct {
long long mat[2][2];
} Matrice;
// Matricea constanta Z = (0 1;
// 1 1)
// Folosesc proprietatea: Z^k = (F_k-1 F_k;
// F_k F_k+1)
// inmultirea matricilor
Matrice inmultire(Matrice A, Matrice B)
{
Matrice C;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
C.mat[i][j] = 0;
for (int k = 0; k < 2; k++)
{
C.mat[i][j] = (C.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % MOD;
}
}
}
return C;
}
// ridicarea la putere a matricilor
Matrice putere(Matrice baza, long long exp)
{
Matrice rezultat = {{{1, 0},{0, 1}}}; // matricea identitate
// ridicarea la putere in timp logaritmic
while (exp > 0)
{
if (exp % 2 == 1)
{
rezultat = inmultire(rezultat, baza);
}
baza = inmultire(baza, baza);
exp = exp/2;
}
return rezultat;
}
int main(void)
{
FILE *fin = fopen("kfib.in", "r");
if (fin == NULL)
{
printf("eroare deschidere fisier intrare\n");
return 1;
}
FILE *fout = fopen("kfib.out", "w");
if (fout == NULL)
{
printf("eroare deschidere fisier iesire\n");
return 1;
}
long long K;
fscanf(fin, "%lld", &K);
if (K == 0)
fprintf(fout, "0\n");
else
{
Matrice Z = {{{0, 1},{1, 1}}}; // matricea constanta
Matrice rezultat_final = putere(Z, K); // Z^K
// F_k e pe pozitia [0][1] sau [1][0]
fprintf(fout, "%lld\n", rezultat_final.mat[0][1]);
}
fclose(fin);
fclose(fout);
return 0;
}