Cod sursa(job #917679)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 18 martie 2013 11:28:36
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#define MOD 666013

using namespace std;

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

long long a[3][3], p[3][3], aux[3][3];
int n;

void Inmulteste_p_a()
{
    int i, j, k;

    aux[1][1]=aux[1][2]=aux[2][1]=aux[2][2]=0;
    for (i=1; i<3; ++i)
    {
        for (k=1; k<3; ++k)
            for (j=1; j<3; ++j)
                aux[i][k]=(aux[i][k]+p[i][j]*a[j][k])%MOD;
    }

    for (i=1; i<3; ++i)
        for (j=1; j<3; ++j) p[i][j]=aux[i][j];
}

void Ridica()
{
    int i, j, k;

    aux[1][1]=aux[1][2]=aux[2][1]=aux[2][2]=0;
    for (i=1; i<3; ++i)
    {
        for (k=1; k<3; ++k)
            for (j=1; j<3; ++j)
                aux[i][k]=(aux[i][k]+a[i][j]*a[j][k])%MOD;
    }

    for (i=1; i<3; ++i)
        for (j=1; j<3; ++j) a[i][j]=aux[i][j];
}

int main()
{
    f>>n; n-=2;

    a[1][2]=a[2][1]=a[2][2]=1;
    p[1][1]=p[2][2]=1;

    while (n)
    {
        if (n%2==1)
        {
            Inmulteste_p_a();
            --n;
        }
        else
        {
            Ridica();
            n/=2;
        }
    }

    g<<(p[1][2]+p[2][2])%MOD<<"\n";

    f.close();
    g.close();
    return 0;
}