Pagini recente » Cod sursa (job #1441602) | Cod sursa (job #2699651) | Clasament lacuricodurimedie | Clasamentul arhivei Infoarena Monthly | Cod sursa (job #3166473)
#include <iostream>
#include <fstream>
using namespace std;
const long long MODUL = 666013;
std::ifstream fin("kfib.in");
std::ofstream fout("kfib.out");
void InmultireMatrici(long long A[2][2], long long B[2][2], long long C[2][2]) {
long long aux[2][2] = {0};
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
for (int k = 0; k < 2; ++k)
aux[i][j] = (aux[i][j] + A[i][k] * B[k][j]) % MODUL;
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
C[i][j] = aux[i][j];
}
void RidicareLaPutere(long long mat[2][2], long long n, long long rez[2][2]) {
long long temp[2][2] = {{mat[0][0], mat[0][1]}, {mat[1][0], mat[1][1]}};
rez[0][0] = 1; rez[0][1] = 0;
rez[1][0] = 0; rez[1][1] = 1;
while (n) {
if (n % 2)
InmultireMatrici(rez, temp, rez);
InmultireMatrici(temp, temp, temp);
n /= 2;
}
}
int main() {
long long k, fib[2][2] = {{1, 1}, {1, 0}}, rez[2][2];
fin >> k;
if (k == 0) {
fout << 0 << endl;
} else {
RidicareLaPutere(fib, k - 1, rez);
fout << rez[0][0] << endl;
}
return 0;
}