Pagini recente » Cod sursa (job #2172657) | Cod sursa (job #3039992) | Cod sursa (job #678498) | Cod sursa (job #2458371) | Cod sursa (job #2260989)
#include <cstdio>
#define MOD 666013
using namespace std;
class Matrix
{
private:
long long a,b,c,d;
public:
Matrix()
{
a=1;
b=0;
c=0;
d=1;
}
Matrix(int x,int y,int z,int t)
{
a=x;
b=y;
c=z;
d=t;
}
long long take(Matrix &m,int y)
{
if(y==1)
return a;
if(y==2)
return b;
if(y==3)
return c;
if(y==4)
return d;
return -1;
}
Matrix &operator=(Matrix m)
{
a=m.a;
b=m.b;
c=m.c;
d=m.d;
return *this;
}
Matrix operator*(Matrix m)
{
Matrix t=*this;
a=t.a*m.a + t.b*m.c;
b=t.a*m.b + t.b*m.d;
c=t.a*m.c + t.d*m.c;
d=t.c*m.b + t.d*m.d;
return *this;
}
Matrix operator%(long long k)
{
a=a%k;
b=b%k;
c=c%k;
d=d%k;
return *this;
}
Matrix operator^(long long n)
{
long long p=n;
Matrix t=Matrix(1,0,0,1);
Matrix l=*this;
while(n>1)
{
if(n%2==1)
{
t=(t*l);
t=t%MOD;
p--;
p=p % MOD;
}
l=(l*l);
l=l % MOD;
n/=2;
}
Matrix f=l*t;
f=f% MOD;
return f;
}
};
long long citire()
{
unsigned long long k;
scanf("%lld",&k);
return k;
}
long long NrFib(long long k)
{
Matrix b(1,1,1,0);
b=b^(k-1);
return b.take(b,1);
}
void Afis(long long k)
{
printf("%lld",k);
}
int main()
{
freopen("kfib.in","r",stdin);
freopen("kfib.out","w",stdout);
long long k;
k=citire();
k=NrFib(k);
Afis(k);
return 0;
}