Cod sursa(job #1536972)

Utilizator hristacheruxiRuxandra Hristache hristacheruxi Data 26 noiembrie 2015 20:12:27
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#define MOD 666013

long long rez[3][3], crez[3][3], I[3][3], CI[3][3];

int copiere(long long a[3][3], long long b[3][3])
{
    int i,j;

    for(i=1;i<=2;i++)
        for(j=1;j<=2;j++)
            a[i][j]=b[i][j];
}

int inmultire(long long a[3][3], long long b[3][3], long long x[3][3])
{
    x[1][1]=(a[1][1]*b[1][1] + a[1][2]*b[2][1])%MOD;
    x[1][2]=(a[1][1]*b[1][2] + a[1][2]*b[2][2])%MOD;
    x[2][1]=(a[2][1]*b[1][1] + a[2][2]*b[2][1])%MOD;
    x[2][2]=(a[2][1]*b[1][2] + a[2][2]*b[2][2])%MOD;
}

int main(){
    freopen("kfib.in" , "r" , stdin);
    freopen("kfib.out" , "w" , stdout);
    int k;

    scanf("%d" , &k);
    k=k-2;

    //I:
    I[1][1]=0;
    I[1][2]=1;
    I[2][1]=1;
    I[2][2]=1;

    //rez:
    rez[1][1]=rez[2][2]=1;

    //CI:
    CI[1][1]=0;
    CI[1][2]=1;
    CI[2][1]=1;
    CI[2][2]=1;

    //crez:
    crez[1][1]=rez[2][2]=1;

    while(k!=0){
        if(k%2==1)
        {
            copiere(crez, rez);
            inmultire(crez, I, rez);
            k--;
        }
        else
        {
            k=k/2;
            copiere(CI, I);
            inmultire(CI, CI, I);
        }
    }

    printf("%lld" , (rez[1][2]+rez[2][2])%MOD);

    return 0;
}