Cod sursa(job #801442)

Utilizator maritimCristian Lambru maritim Data 24 octombrie 2012 13:09:44
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>

FILE *f = fopen("kfib.in","r");
FILE *g = fopen("kfib.out","w");

#define MaxMat 5
#define Mod 666013

int N;
int A[MaxMat][MaxMat],M[MaxMat][MaxMat];

void citire(void)
{
    fscanf(f,"%d",&N);
}

void Mul(int A[MaxMat][MaxMat],int B[MaxMat][MaxMat])
{
    int C[MaxMat][MaxMat];

    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
            C[i][j] = 0;

    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
            for(int k=1;k<=2;k++)
                C[i][j] += (1LL*A[i][k]*B[k][j])%Mod;

    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
            A[i][j] = C[i][j]%Mod;
}

void Initializare(void)
{
    M[1][1] = M[2][1] = M[1][2] = 1;
    M[2][2] = 0;
    
    A[1][1] = A[2][2] = 1;
}

void Afisare(int M[MaxMat][MaxMat])
{
    for(int i=1;i<=2;i++,printf("\n"))
        for(int j=1;j<=2;j++)
            printf("%d ",M[i][j]);

    printf("\n");
}

int main()
{
    citire();

    Initializare();

    N ++;

    for(int i=0;(1<<i) <= N;i++)
    {
        if(N & (1<<i))
            Mul(A,M);
        Mul(M,M);
    }

    fprintf(g,"%d ",A[2][2]);
}