Cod sursa(job #1674768)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 4 aprilie 2016 20:47:55
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 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;
};

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;
        m.l = 2;
        m.c = 2;
        m.a[1][1] = 0;
        m.a[1][2] = 1;
        m.a[2][1] = 1;
        m.a[2][2] = 1;
        m = ridicare(m,k-1);
        matrix fib;
        fib.l = 1;
        fib.c = 2;
        fib.a[1][1] = 0;
        fib.a[1][2] = 1;
        fib = inmultire(fib,m);
        out<<fib.a[1][2]%MOD<<"\n";
        out.close();
    }
    return 0;
}