Cod sursa(job #1602728)

Utilizator bullseYeIacob Sergiu bullseYe Data 16 februarie 2016 21:42:35
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
//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;
}