Cod sursa(job #1674688)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 4 aprilie 2016 20:02:20
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#define MOD 666013

using namespace std;

ifstream in("kfib.in");
ofstream out("kfib.out");

class matrix{
public:
    long long int a[3][3];
    int l,c;
    matrix(int x,...)
    {
        int nr = 1;
        l = x;
        c = *(&x+nr);
        nr++;
        for(int i=1;i<=l;i++)
            for(int j=1;j<=c;j++)
            {a[i][j] = *(&x+nr);nr++;}
    }
    matrix(){}
};

int k;

matrix inmultire(matrix a,matrix b)
{
    matrix r;
    r.l = a.l;
    r.c = b.c;
    for(int i=1;i<=a.l;i++)
        for(int j=1;j<=b.c;j++)
        r.a[i][j] = 0;
    for(int i=1;i<=a.l;i++)
        for(int j=1;j<=b.c;j++)
            for(int k=1;k<=a.c;k++)
            r.a[i][j]+= (1LL*a.a[i][k]*b.a[k][j])%MOD;
    return r;
}

matrix ridicare(matrix a,int p)
{
    if(p==1)
        return a;
    else
    {
        if(p%2==0)
        {
            matrix aux = ridicare(a,p/2);
            return inmultire(aux,aux);
        }
        else
            return inmultire(a,ridicare(a,p-1));
    }
}

int main()
{
    in>>k;
    in.close();
    if(k==1)
        out<<0<<"\n";
    else
    {
        matrix m(2,2,0,1,1,1);
        m = ridicare(m,k-1);
        matrix fib(1,2,0,1);
        fib = inmultire(fib,m);
        out<<fib.a[1][2]%MOD<<"\n";
        out.close();
    }
    return 0;
}