Pagini recente » Cod sursa (job #2523632) | Cod sursa (job #1805785) | Cod sursa (job #2726004) | Cod sursa (job #2393960) | Cod sursa (job #1665201)
#include <stdio.h>
#define A 0
#define B 1
#define C 2
#define D 3
#define MOD 666013
struct matrix2x2
{
long long int m[2][2];
matrix2x2(){}
matrix2x2(long long int a, long long int b, long int c, long int d)
{
long long *_m = &m[0][0];
_m[0] = a, _m[1] = b, _m[2] = c, _m[3] = d;
}
matrix2x2(const matrix2x2 &a)
{
m[0][0] = a.m[0][0], m[1][0] = a.m[1][0], m[0][1] = a.m[0][1], m[1][1] = a.m[1][1];
}
void print()
{
printf("%d %d\n", m[0][0], m[0][1]);
printf("%d %d\n", m[1][0], m[1][1]);
}
matrix2x2 operator*(const matrix2x2& a)
{
const long long int *m1 = &m[0][0], *m2 = &a.m[0][0];
return matrix2x2(
(m1[A] * m2[A] + m1[B] * m2[C]) % MOD,
(m1[A] * m2[B] + m1[B] * m2[D]) % MOD,
(m1[C] * m2[A] + m1[D] * m2[C]) % MOD,
(m1[C] * m2[B] + m1[D] * m2[D]) % MOD
);
}
int operator[](int a)
{
return (&m[0][0])[a];
}
};
matrix2x2 pow(matrix2x2 a, long long int b)
{
if(b == 1)
return a;
matrix2x2 c = pow(a, b / 2);
if(b % 2 == 0)
return c * c;
else return (c * c) * a;
}
matrix2x2 Z(0, 1, 1, 1), init(0, 1, 0, 0);
int main()
{
FILE *fin = fopen("kfib.in", "r"),
*fout = fopen("kfib.out", "w");
long long int n;
fscanf(fin, "%lld", &n);
fprintf(fout, "%lld", (init * pow(Z, n))[A]);
fclose(fin);
fclose(fout);
return 0;
}