Cod sursa(job #2328793)

Utilizator AlexTudorAlex Brinza AlexTudor Data 26 ianuarie 2019 10:47:46
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;

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


const int MOD = 666013;

int n;
int mat[3][3],aux[3][3],init[3][3];

void expo(int pow)
{
    if(pow <= 1) return;

    expo(pow/2);

    for( int i = 1; i <= 2; ++i)
        for( int j = 1; j <= 2; ++j)
        {
         aux[i][j]=0;
         for(int J = 1, I = 1; J <= 2; ++J, ++I)
            aux[i][j]+= (1LL * mat[i][J] * mat[I][j] ) % MOD;

         aux[i][j]%=MOD;
        }

    if(pow % 2)
    {
        for( int i = 1; i <= 2; ++i)
            for( int j = 1; j <= 2; j++)
                mat[i][j] = aux[i][j];


         for( int i = 1; i <= 2; ++i)
            for( int j = 1; j <= 2; j++)
            {
                aux[i][j]=0;
                for(int J = 1, I = 1; J <= 2; ++J, ++I)
                    aux[i][j]+= (1LL * mat[i][J] * init[I][j] ) % MOD;

             aux[i][j]%=MOD;
            }

    }

    for( int i = 1; i <= 2; ++i)
        for( int j = 1; j <= 2; j++)

            mat[i][j] = aux[i][j];
}

int main()
{
    fin>>n;

    init[1][2]=init[2][1]=init[2][2]=1;
    mat[1][2]=mat[2][1]=mat[2][2]=1;

    expo(n-2);
    if(n==1 || n==2) fout<<1;
    else fout<<(mat[1][2] + mat[2][2]) % MOD;


    return 0;
}