Pagini recente » Cod sursa (job #1737420) | Cod sursa (job #1108037) | Cod sursa (job #3175480) | Cod sursa (job #3174705) | Cod sursa (job #969310)
Cod sursa(job #969310)
#include <fstream>
#include <cstring>
#define X 666013
#define D 5
using namespace std;
ifstream f("kfib.in");
ofstream g("kfib.out");
int k,Z[D][D], Sol[D][D];
//in Sol intra puterea lui Z
//C=A*B // mod X
void mult(int A[][D], int B[][D], int C[][D])
{
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j]) % X;
}
void ExponentiereRapida(int P,int Sol[][D])
{
int C[D][D], AUX[D][D];
memcpy(C, Z, sizeof(Z));
Sol[0][0]=Sol[1][1]=1;
while(P!=1)
if(P % 2==0)
{
memset(AUX, 0, sizeof(AUX));
mult(C, C, AUX);
memcpy(C, AUX, sizeof(C));
P/=2;
}
else
{
memset(AUX, 0, sizeof(AUX));
mult(Sol,C,AUX);
memcpy(Sol,AUX,sizeof(AUX));
P--;
}
memset(AUX, 0, sizeof(AUX));
mult(C,Sol,AUX);
memcpy(Sol,AUX,sizeof(AUX));
}
int main() {
f>>k;
Z[0][0]=0; Z[0][1]=1;
Z[1][0]=1; Z[1][1]=1;
ExponentiereRapida(k-1,Sol);
g<<Sol[1][1]<<'\n';
f.close();g.close();
return 0;
}