Cod sursa(job #922808)
#include <fstream>
//#include <iostream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
int z[2][2];
int aux[2][2],rez[2][2];
#define MODULO 666013
int k;
int check(long long val)
{
val %= MODULO ;
return val;
}
void fx(int a[2][2],int b[2][2]) // A <- B*A;
{
int c[2][2];
c[0][0] = check((long long) a[0][0]*b[0][0]) + check((long long) a[1][0]*b[0][1]);
c[1][0] = check((long long) a[0][0]*b[1][0]) + check((long long) a[1][0]*b[1][1]);
c[0][1] = check((long long) a[0][0]*b[0][1]) + check((long long) a[0][1]*b[1][1]);
c[1][1] = check((long long) a[1][0]*b[0][1]) + check((long long) a[1][1]*b[1][1]);
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
a[i][j] = c[i][j];
if(a[i][j] > MODULO) a[i][j] -= MODULO;
if(b[i][j] > MODULO) b[i][j] -= MODULO;
}
}
void logx(int pow)
{
aux[1][1] = aux[0][0] = 1;
int rez2=2,aux2=1;
while(pow)
{
if(pow%2 == 1)
{
fx(aux , rez);
//aux2 = rez2*aux2;
}
pow = pow / 2;
if(pow)
//rez2=rez2*rez2;
fx(rez , rez);
}
}
void solve()
{
logx(k-1);
//for(int i=0;i<2;i++)
// for(int j=0;j<2;j++)
// fout<<aux[i][j]<<" ";
fout<<(aux[1][0] + aux[0][0])%MODULO;
}
void init()
{
rez[0][0] = z[0][0] = 0;
rez[1][0] = z[1][0] = 1;
rez[1][1] = z[1][1] = 1;
rez[0][1] = z[0][1] = 1;
fin>>k;
}
int main()
{
init();
solve();
// fout<<logx(11);
}