Pagini recente » Cod sursa (job #214782) | Cod sursa (job #2871057) | Cod sursa (job #2553198) | Cod sursa (job #2305174) | Cod sursa (job #2723697)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("kfib.in");
ofstream g ("kfib.out");
int n;
int a[3][3];
int aux[3][3];
const int mod = 666013;
void Multiply (int a[3][3], int b[3][3])
{
bool ok = false;
for (int i=1; i<=2; i++)
{
for (int j=1; j<=2; j++)
{
if (a[i][j] != 0)
ok = true;
}
}
if (!ok)
{
for (int i=1; i<=2; i++)
{
for (int j=1; j<=2; j++)
{
a[i][j] = b[i][j];
}
}
}
else
{
int c[3][3];
memset(c, 0, sizeof(c));
for (int i=1; i<=2; i++)
{
for (int j=1; j<=2; j++)
{
for (int k=1; k<=2; k++)
{
c[i][j] = (1LL * c[i][j] + (1LL * a[i][k] * b[k][j]) % mod) % mod;
}
}
}
for (int i=1; i<=2; i++)
{
for (int j=1; j<=2; j++)
{
a[i][j] = c[i][j];
}
}
}
}
void RidicareLog (int p)
{
while (p)
{
if (p % 2 == 1)
Multiply(aux, a);
Multiply(a, a);
p /= 2;
}
}
int main()
{
f >> n;
if (n == 0 || n == 1)
g << 1;
else if (n == 2) g << 2;
else
{
a[1][1] = 0; a[1][2] = 1;
a[2][1] = 1; a[2][2] = 1;
RidicareLog (n-2);
g << (1LL * aux[1][2] + aux[2][2]) % mod;
}
return 0;
}