Cod sursa(job #2737972)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 5 aprilie 2021 13:05:41
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
//Ilie Dumitru
#include<cstdio>
#define mod 666013

long long int curent[2][2]={0, 1, 1, 1}, aux[2][2];

void specPrint()
{
    for(int i=0;i<4;++i) {printf("%lld ", curent[i>>1][i&1]); if(i&1) printf("\n");};
}

void calc(int K)
{
    if(K>1)
    {
        calc(K>>1);
        aux[0][0]=(curent[0][0]*curent[0][0]+curent[0][1]*curent[1][0])%mod;
        aux[0][1]=(curent[0][0]*curent[0][1]+curent[0][1]*curent[1][1])%mod;
        aux[1][0]=(curent[1][0]*curent[0][0]+curent[1][1]*curent[1][0])%mod;
        aux[1][1]=(curent[1][0]*curent[0][1]+curent[1][1]*curent[1][1])%mod;
        for(int i=0;i<4;++i) curent[i>>1][i&1]=aux[i>>1][i&1];
        if(K&1)
        {
            aux[0][0]=curent[0][1];
            aux[0][1]=(curent[0][0]+curent[0][1])%mod;
            aux[1][0]=curent[1][1];
            aux[1][1]=(curent[1][0]+curent[1][1])%mod;
            for(int i=0;i<4;++i) curent[i>>1][i&1]=aux[i>>1][i&1];
        }
    }
}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);
    int K;
    scanf("%d", &K);
    fclose(stdin);
    if(!K)
        printf("0");
    else if(K==1)
        printf("1");
    else
    {
        calc(K);
        printf("%lld", curent[0][1]);
    }
    fclose(stdout);
    return 0;
}