Pagini recente » Cod sursa (job #2950847) | Cod sursa (job #1785698) | Cod sursa (job #695957) | Cod sursa (job #1435255) | Cod sursa (job #1602728)
//exponentiere rapida, inmultire de matrice
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MODULO 666013
using namespace std;
int k;
int Z[4][4], SOL[4][4], I2[4][4], AUX[4][4];
void read();
void exp_rapida (int, int[][4]);
void mult (int[][4], int [][4], int[][4]);// A * B = C
void result();
int main(){
read();
SOL[1][1]=SOL[1][2]=1;
Z[1][1]=0; Z[1][2]=Z[2][1]=Z[2][2]=1;
exp_rapida (k-1, Z);
mult (SOL, Z, SOL);
result();
return 0;
}
void read(){
ifstream fin ("kfib.in");
fin>>k;
fin.close();
}
void exp_rapida (int p, int Z[][4]){
//calculez in Z rezultatul. folosesc AUX ca matrice auxiliara
if (p==0){
memset (Z, 0, sizeof (Z));
return;
}
if (p==1){
Z[1][1]=0; Z[1][2]=Z[2][1]=Z[2][2]=1;
return;
}
if (p%2==0){//Z^p=Z^(p/2) * Z^(p/2);
exp_rapida (p/2, Z);
mult (Z, Z, Z);
}
else{
int AUX[4][4];
AUX[1][1]=Z[1][1];
AUX[1][2]=Z[1][2];
AUX[2][1]=Z[2][1];
AUX[2][2]=Z[2][2];
exp_rapida((p-1)/2, Z);
mult (Z, Z, Z);
mult (Z, AUX, Z);
}
return;
}
void mult (int M1[][4], int M2[][4], int C[][4]){
int A[4][4], B[4][4];
int i, j, k;
//memcpy (A, M1, sizeof(M1));
//memcpy (B, M2, sizeof(M2));
for (i=1; i<=2; ++i)
for (j=1; j<=2; ++j){
A[i][j]=M1[i][j];
B[i][j]=M2[i][j];
}
for (i=1; i<=2; ++i)
for (j=1; j<=2; ++j){
C[i][j]=0;
for (k=1; k<=2; ++k){
C[i][j]=(C[i][j] + A[i][k]*B[k][j] )%MODULO;
}
}
return;
}
void result(){
ofstream fout ("kfib.out");
fout<<SOL[1][1]<<"\n";
fout<<SOL[1][2]<<"\n";//asta e aia buna
fout.close();
return;
}