Cod sursa(job #969295)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 4 iulie 2013 00:27:27
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <cstring>
#define X 666013
#define D 5
using namespace std;
ifstream f("kfib.in");
ofstream g("kfib.out");

int k;
int Z[D][D], Sol[D][D];

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;
    for (int i=0;(1 << i)<=P;i++)
    {
        if ( P&(1<<i)  ) //Sol=Sol*C;
        {
            memset(AUX, 0, sizeof(AUX));
            mult(Sol,C,AUX);
            memcpy(Sol,AUX,sizeof(AUX));
        }
        //C=C*C;
        memset(AUX, 0, sizeof(AUX));
        mult(C, C, AUX);
        memcpy(C, AUX, sizeof(C));
    }
}

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;
}