Pagini recente » Borderou de evaluare (job #508720) | Cod sursa (job #1430310) | Cod sursa (job #3252133) | Cod sursa (job #857272) | Cod sursa (job #2591039)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("kfib.in");
ofstream fout("kfib.out");
#define MOD 666013
#define ull unsigned long long
ull k;
struct matrice
{
ull A[2][2];
}Z,M;
matrice prod (matrice X,matrice Y)
{
matrice sol;
int i,j,h;
for (i=0;i<=1;++i)
{
for (j=0;j<=1;++j)
{
sol.A[i][j]=0;
}
}
for (i=0;i<=1;++i)
{
for (j=0;j<=1;++j)
{
for (h=0;h<=1;++h)
{
sol.A[i][j]=(sol.A[i][j]%MOD+((X.A[i][h]%MOD)*(Y.A[h][j]%MOD)))%MOD;
}
}
}
return sol;
}
matrice putere (matrice X,ull k)
{
matrice D;
int i,j;
for (i=0;i<=1;++i)
{
for (j=0;j<=1;++j)
{
D.A[i][j]=0;
}
}
D.A[0][0]=D.A[1][1]=1;
while (k>0)
{
if (k%2==0)
{
X=prod(X,X);
k/=2;
}
else
{
D=prod(D,X);
--k;
}
for (int i=0;i<=1;++i)
{
for (int j=0;j<=1;++j)
{
cout << D.A[i][j] << " ";
}
cout << '\n';
}
cout << "\n\n\n\n";
}
return D;
}
int main()
{
fin >> k;
if (k==0)
{
fout << 0;
return 0;
}
Z.A[0][1]=Z.A[1][0]=Z.A[1][1]=M.A[0][1]=1;
matrice rez=putere(Z,k-1);
rez=prod(M,rez);
fout << rez.A[0][1]%MOD;
fin.close();
fout.close();
return 0;
}