Pagini recente » Cod sursa (job #884153) | Cod sursa (job #575624) | Cod sursa (job #848358) | Cod sursa (job #890255) | Cod sursa (job #2763145)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
string NumeFisier = "kfib";
ifstream fin(NumeFisier + ".in");
ofstream fout(NumeFisier + ".out");
typedef unsigned long long int ull;
typedef long long int ll;
const ll MOD = 666013;
ll Rez[3][3] = { {0,0,0},
{0,1,1},
{0,1,0}
};
void MatrixProduct(ll C[][3], ll A[][3], ll B[][3])
{
//C = A * B;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
for (int k = 1; k <= 2; k++)
C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
}
void Cpy(ll A[][3], ll B[][3])
{
// A <- B
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
A[i][j] = B[i][j];
}
void Empty(ll A[][3])
{
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
A[i][j] = 0;
}
void FastExpo(int exp)
{
ll Aux1[3][3];
ll Aux2[3][3];
ll Baza[3][3];
Cpy(Baza, Rez);
while (exp)
{
if (exp % 2 == 1)
{
Cpy(Aux1, Baza);
Cpy(Aux2, Rez);
Empty(Rez);
MatrixProduct(Rez, Aux1, Aux2);
}
Cpy(Aux1, Baza);
Empty(Baza);
MatrixProduct(Baza, Aux1, Aux1);
exp /= 2;
}
}
int main()
{
ll n;
fin >> n;
FastExpo(n - 2);
fout << Rez[1][1];
}