Pagini recente » Monitorul de evaluare | Cod sursa (job #2649130) | Cod sursa (job #930569) | Cod sursa (job #1481569) | Cod sursa (job #1240745)
#include <fstream>
using namespace std;
ifstream ka("kfib.in");
ofstream ki("kfib.out");
const int MOD = 666013;
int k;
long long m[2][2], partial[2][2], sol[2][2], partsol[2][2];
void completare(int k)
{
while(k)
{
if(k % 2 == 1)
{
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
partsol[i][j] = sol[i][j];
sol[0][0] = (partsol[0][0] * m[0][0] + partsol[0][1] * m[1][0]) % MOD;
sol[0][1] = (partsol[0][0] * m[0][1] + partsol[0][1] * m[1][1]) % MOD;
sol[1][0] = (partsol[1][0] * m[0][0] + partsol[1][1] * m[1][0]) % MOD;
sol[1][1] = (partsol[1][0] * m[0][1] + partsol[1][1] * m[1][1]) % MOD;
}
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
partial[i][j] = m[i][j];
m[0][0] = (partial[0][0] * partial[0][0] + partial[0][1] * partial[1][0]) % MOD;
m[0][1] = (partial[0][0] * partial[0][1] + partial[0][1] * partial[1][1]) % MOD;
m[1][0] = (partial[1][0] * partial[0][0] + partial[1][1] * partial[1][0]) % MOD;
m[1][1] = (partial[1][0] * partial[0][1] + partial[1][1] * partial[1][1]) % MOD;
k /= 2;
}
}
int main()
{
ka >> k;
if(k >= 1)
{
m[0][1] = 1;
m[1][0] = 1;
m[1][1] = 1;
sol[0][0] = 1;
sol[1][1] = 1;
completare(k - 1);
}
ki << sol[1][1];
}