Cod sursa(job #2338489)

Utilizator alex02Grigore Alexandru alex02 Data 7 februarie 2019 15:50:29
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;

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

///matr1 e ala in care se salveaza rez

void copiere(long long matr_finala[][100], long long matr[][100])
{
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            matr_finala[i][j]=matr[i][j];
        }
    }
}

void inm(long long matr1[][100], long long matr2[][100])
{
    long long aux_matr1[100][100]= {0};
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            for(int k=0; k<2; k++)
            {
                aux_matr1[i][j]+=1ll * (matr1[i][k]*matr2[k][j]);
                aux_matr1[i][j]%=MOD;
                //cout<<i<<","<<j<<" = "<<i<<","<<k<<"  +  "<<k<<","<<j<<"     <->      "<<aux_matr1[i][j]<<" = "<<matr1[i][k]<<" + "<<matr2[k][j]<<endl;
            }

        }
    }

    copiere(matr1,aux_matr1);
}

void ridicare(long long matr_N[][100],long long p)
{
    p--;
    long long matr_r[100][100];
    copiere(matr_r,matr_N);

    while(p!=0)
    {
        if(p%2==1)
        {
            inm(matr_r,matr_N);
        }
        inm(matr_N,matr_N);
        p/=2;
    }
    copiere(matr_N,matr_r);
}

int main()
{
    long long matr[100][100],index;
    matr[0][0]=0,matr[0][1]=1,matr[1][0]=1,matr[1][1]=1;

    f>>index;
    ridicare(matr,index);
    /*for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
            cout<<matr[i][j]<<" ";
        cout<<endl;
    }*/
    long long sir[10];
    sir[0]=0;
    sir[1]=1;
    sir[2]=0;
    sir[3]=0;
    for(int i=2; i<4; i++)
    {
        for(int j=0; j<2; j++)
        {
            {
                sir[i]+=1ll *(sir[j]*matr[j][i-2]);
                sir[i]%=MOD;
            }
        }
    }
    g<<sir[2]<<endl;
    return 0;
}