Pagini recente » Cod sursa (job #1595476) | Cod sursa (job #74803) | Cod sursa (job #2674827) | Cod sursa (job #1942178) | Cod sursa (job #1807206)
/// Problema "Kfib" - InfoArena
#include <cstdio>
#include <algorithm>
#define in "kfib.in"
#define out "kfib.out"
#define MOD 666013
using namespace std;
struct matrice
{
int mat[3][3];
} aux, null, ans, ceva;
int n;
inline void init()
{
aux.mat[1][1] = 0;
aux.mat[1][2] = 1;
aux.mat[2][1] = 1;
aux.mat[2][2] = 1;
null.mat[1][1] = 1;
null.mat[1][2] = 0;
null.mat[2][1] = 0;
null.mat[2][2] = 1;
}
matrice inmultire(const matrice &M1, const matrice &M2)
{
matrice sol;
for(int i = 1; i<= 2; ++i)
{
for(int j = 1; j<= 2; ++j)
{
sol.mat[i][j] = 0;
for(int k = 1; k<= 2; ++k)
{
sol.mat[i][j] = (sol.mat[i][j] + 1LL*M1.mat[i][k]*M2.mat[k][j])%MOD;
}
}
}
return sol;
}
matrice power(const matrice &base, const int &Exp)
{
matrice sol = null, tmp = base;
int pw = Exp;
for( ; pw; pw>>=1)
{
if(pw&1)
{
sol = inmultire(sol, tmp);
}
tmp = inmultire(tmp, tmp);
}
return sol;
}
int main()
{
freopen(in, "r", stdin);
freopen(out, "w", stdout);
scanf("%d", &n);
init();
if(n == 0) {printf("0\n");return 0;}
if(n == 1) {printf("1\n");return 0;}
if(n == 2) {printf("1\n");return 0;}
ans = power(aux, n-2);
printf("%d\n", (ans.mat[1][2] + ans.mat[2][2]) % MOD);
return 0;
}