Pagini recente » Cod sursa (job #1491318) | Monitorul de evaluare | Cod sursa (job #1503399) | Cod sursa (job #1821414) | Cod sursa (job #2450046)
#include <fstream>
#include <cstring>
#define MODULO 666013
using namespace std;
int mat[2][2], sol[2][2];
inline void produs(int a[2][2], int b[2][2], int c[2][2])
{
int i, j, k;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
for(k = 0; k < 2; k++)
c[i][j] = (c[i][j] + 1LL * a[i][k] * b[k][j]) % MODULO;
}
inline void ridicare(int p)
{
int i, c[2][2], aux[2][2];
memcpy(c, mat, sizeof(mat));
for(i = 0; (1 << i) <= p; i++)
{
if(p & (1 << i))
{
memset(aux, 0, sizeof(aux));
produs(sol, c, aux);
memcpy(sol, aux, sizeof(aux));
}
memset(aux, 0, sizeof(aux));
produs(c, c, aux);
memcpy(c, aux, sizeof(aux));
}
}
int main()
{
int n;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
fin >> n;
mat[0][0] = 0;
mat[0][1] = mat[1][0] = mat[1][1] = 1;
sol[0][0] = 0;
sol[0][1] = 1;
ridicare(n - 1);
fout << sol[0][1];
fin.close();
fout.close();
return 0;
}