Cod sursa(job #1791494)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 29 octombrie 2016 14:00:16
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia4-programaredinamica2 Marime 1.16 kb
#include<stdio.h>
#define MOD 666013
FILE*fin=fopen("kfib.in","r");
FILE*fout=fopen("kfib.out","w");
long long Z[2][2];
long long mat[2][2];
void inmultire(long long a[2][2],long long b[2][2])
{
    long long rez[2][2];
    rez[0][0]=rez[0][1]=rez[1][0]=rez[1][1]=0;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                rez[i][j]=(rez[i][j]%MOD+(a[i][k]%MOD*b[k][j]%MOD)%MOD)%MOD;
            }
        }
    }
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        a[i][j]=rez[i][j];
    }
}
void lgput(int n)
{
    long long r[2][2];
    r[0][0]=0;
    r[0][1]=r[1][0]=r[1][1]=1;
    while(n>1)
    {
        if(n%2==0)
        {
            inmultire(Z,Z);
            n/=2;
        }
        else
        {
            inmultire(r,Z);
            inmultire(Z,Z);
            n/=2;
        }
    }
    if(n==1)
        inmultire(Z,r);
}
int main()
{
    int K;
    fscanf(fin,"%d",&K);
    if(K==0)
    {
        printf("0");
        return 0;
    }
    Z[0][1]=Z[1][0]=Z[1][1]=1;
    lgput(K-1);
    mat[0][1]=1;
    inmultire(mat,Z);
    fprintf(fout,"%lld",mat[0][0]);
    return 0;
}