Pagini recente » Cod sursa (job #1174852) | Cod sursa (job #2933161) | Cod sursa (job #567956) | Cod sursa (job #2601037) | Cod sursa (job #2189621)
#include <fstream>
std::ifstream in("kfib.in");
std::ofstream out("kfib.out");
const int MOD = 666013;
const int MAT_SIZE = 2;
class Matrix {
int mat[MAT_SIZE][MAT_SIZE];
public:
Matrix() {
for (int i = 0; i < MAT_SIZE; i++)
for (int j = 0; j < MAT_SIZE; j++)
mat[i][j] = 0;
}
void setElement(int row, int col, int val) {
mat[row][col] = val;
}
int getElement(int row, int col) {
return mat[row][col];
}
friend Matrix operator * (const Matrix& a, const Matrix& b) {
Matrix result;
for (int i = 0; i < MAT_SIZE; i++)
for (int j = 0; j < MAT_SIZE; j++)
for (int k = 0; k < MAT_SIZE; k++)
result.mat[i][j] = (result.mat[i][j] + 1LL * a.mat[i][k] * b.mat[k][j]) % MOD;
return result;
}
friend Matrix operator *= (Matrix& a, const Matrix& b) {
Matrix result = a * b;
a = result;
return a;
}
friend Matrix operator ^ (const Matrix& a, int p) {
Matrix result = Matrix::Identity();
Matrix mat = a;
for (; p; p >>= 1) {
if (p & 1)
result *= mat;
mat *= mat;
}
return result;
}
static Matrix Identity() {
Matrix m;
for (int i = 0; i < MAT_SIZE; i++)
m.mat[i][i] = 1;
return m;
}
};
int main() {
int k;
in >> k;
Matrix mat;
mat.setElement(0, 1, 1);
mat.setElement(1, 0, 1);
mat.setElement(1, 1, 1);
Matrix raised = mat ^ (k - 1);
out << raised.getElement(1, 0) + raised.getElement(0, 0);
return 0;
}