Cod sursa(job #1727249)

Utilizator RRomaniucRomaniuc Radu Andrei RRomaniuc Data 10 iulie 2016 12:36:12
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#define mod 666013
#define ll long long
ll Y[2][2] = {1,0,0,1}, Z[2][2] = {0,1,1,1};
FILE *inputFile = fopen("kfib.in", "r"), *outputFile = fopen("kfib.out", "w");
void afisareMatrice(ll m[2][2])
{
    int i,j;
    
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
            fprintf(outputFile, "%lld ", m[i][j]);
        
        fprintf(outputFile, "\n");
    }
    fprintf(outputFile, "\n");
}
void inmultire(ll A[2][2], ll B[2][2], ll C[2][2])
{
    ll AUXA[2][2] = { A[0][0], A[0][1], A[1][0], A[1][1]},
    AUXB[2][2] = { B[0][0], B[0][1], B[1][0], B[1][1]};
    
    C[0][0] = (AUXA[0][0] * AUXB[0][0] + AUXA[0][1] * AUXB[0][1]) % mod;
    C[0][1] = (AUXA[0][0] * AUXB[0][1] + AUXA[0][1] * AUXB[1][1]) % mod;
    C[1][0] = (AUXA[1][0] * AUXB[0][0] + AUXA[1][1] * AUXB[0][1]) % mod;
    C[1][1] = (AUXA[1][0] * AUXB[0][1] + AUXA[1][1] * AUXB[1][1]) % mod;
   
}
void exp(ll putere, ll matrice[2][2])
{
    while(putere > 1)
        if(putere % 2 == 0)
        {
            putere /= 2;
            inmultire(matrice, matrice, matrice);
        }
        else
        {
            putere = (putere - 1) / 2;
            inmultire(Y, matrice, Y);
            inmultire(matrice, matrice, matrice);
        }
    
    inmultire(Y, matrice, matrice);
}
int main()
{
    
    
    ll n, A[2][2] = {0,1,0,0}, B[2][2] = {0,1,1,1}, C[2][2] = {0};
    
    fscanf(inputFile, "%lld", &n);
    
    //Mn = M1 * Z^(n-1)
  
    
    exp(n-1,B);
    
    inmultire(A, B, C);
    
    fprintf(outputFile, "%lld", C[0][1]);
    
    return 0;
}