Cod sursa(job #849160)

Utilizator mihai10stoicaFMI - Stoica Mihai mihai10stoica Data 6 ianuarie 2013 16:49:46
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<cstdio>
#include<cstdlib>
#include<cstring>
int k,i,mat[2][2],sol[2][2];
void mult(int a[2][2],int b[2][2],int c[2][2])
{
    int j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%66013;
}
void power(int p, int m[2][2])
{
    int c[2][2],aux[2][2];
    memcpy(c,mat,sizeof(mat));
    m[0][0]=m[1][1]=1;
    for(i=0;(1<<i)<=p;i++)
    {
        if(p&(1<<i))
        {
            memset(aux,0,sizeof(aux));
            mult(m,c,aux);
            memcpy(m,aux,sizeof(aux));
        }
    memset(aux,0,sizeof(aux));
    mult(c,c,aux);
    memcpy(c,aux,sizeof(c));
    }
}
int main()
{
    FILE *f=fopen("kfib.in","r"),*g=fopen("kfib.out","w");
    fscanf(f,"%d",&k);
    mat[0][0]=0;mat[0][1]=mat[1][1]=mat[1][0]=1;
    power(k-1,sol);
    fprintf(g,"%d",sol[1][1]);
    fclose(f);fclose(g);
    return 0;
}