Pagini recente » Cod sursa (job #5823) | Cod sursa (job #816412) | Cod sursa (job #2250173) | Cod sursa (job #611642) | Cod sursa (job #764204)
Cod sursa(job #764204)
/*
Al k-ulea termen Fibonacci - folosind inmultirea matricilor.
*/
#include <stdio.h>
#include <stdlib.h>
#define MOD 666013
long long z[2][2], m[2][2];
void fibo_mat (long long m[2][2], long long mat[2][2]) {
long long f[2][2];
f[0][0] = (m[0][0] * mat[0][0] + m[0][1] * mat[1][0]) % MOD;
f[0][1] = (m[0][0] * mat[0][1] + m[0][1] * mat[1][1]) % MOD;
f[1][0] = (m[1][0] * mat[0][0] + m[1][1] * mat[1][0]) % MOD;
f[1][1] = (m[1][0] * mat[0][1] + m[1][1] * mat[1][1]) % MOD;
int i, j;
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
m[i][j] = f[i][j] % MOD;
}
void fibo_putere_log (int k) {
if (k > 1) {
fibo_putere_log(k / 2);
fibo_mat(m, m);
if (k % 2)
fibo_mat(m, z);
}
}
int main () {
freopen("kfib.in", "r", stdin);
freopen("kfib.out", "w", stdout);
int k;
scanf("%d", &k);
z[0][0] = 0;
z[0][1] = z[1][0] = z[1][1] = 1;
m[0][0] = 0;
m[0][1] = m[1][0] = m[1][1] = 1;
fibo_putere_log(k + 1);
printf("%lld\n", m[0][0]);
return 0;
}