Cod sursa(job #1660310)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 22 martie 2016 22:57:21
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#define MOD 666013

using namespace std;

int a[5][5],b[5][5];

inline void Mult_Mat(int a[][5], int b[][5])
{
    int c[5][5],i,j,k,s;
    for(i=1;i<=2;++i)
        for(k=1;k<=2;++k)
        {
            s=0;
            for(j=1;j<=2;++j)
                s=(1LL*s+1LL*a[i][k]*b[k][j])%MOD;
            c[i][j]=s;
        }
    for(i=1;i<=2;++i)
        for(j=1;j<=2;++j)
            a[i][j]=c[i][j];
}

inline void Pow_Log(int a[][5], int p)
{
    int put[5][5],i,j;
    for(i=0;i<=4;++i)
        for(j=0;j<=4;++j)
            put[i][j]=0;
    put[1][1]=put[2][2]=1;
    while(p)
    {
        if(p&1)
        {
            --p;
            Mult_Mat(put,a);
        }
        p>>=1;
        Mult_Mat(a,a);
    }
    for(i=1;i<=2;++i)
        for(j=1;j<=2;++j)
            a[i][j]=put[i][j];
}

int main()
{
    int N;
    freopen ("kfib.in","r",stdin);
    freopen ("kfib.out","w",stdout);
    scanf("%d", &N);
    if(!N)
        printf("0\n");
    else
    {
        a[1][2]=1;
        b[1][2]=b[2][1]=b[2][2]=1;
        Pow_Log(b,N-1);
        Mult_Mat(a,b);
        printf("%d\n", a[1][2]);
    }
    return 0;
}