Cod sursa(job #2056455)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 4 noiembrie 2017 11:52:14
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <cstdio>
#define mod 666013

using namespace std;

int mat[2][2]={0, 1, 1, 1}, n, rez[2][2];

void inmultire(int rez[2][2], int a[2][2], int b[2][2])
{
    rez[0][0]=((a[0][0]*b[0][0])%mod+(a[0][1]*b[1][0])%mod)%mod;
    rez[0][1]=((a[0][0]*b[0][1])%mod+(a[0][1]*b[1][1])%mod)%mod;
    rez[1][0]=((a[1][0]*b[0][0])%mod+(a[1][1]*b[1][0])%mod)%mod;
    rez[1][1]=((a[1][0]*b[0][1])%mod+(a[1][1]*b[1][1])%mod)%mod;
}

void exponentiere(int p)
{
    if(p==1)
        return;
    if(p%2==0)
    {
        inmultire(rez, mat, mat);
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                mat[i][j]=rez[i][j];
        exponentiere(p/2);
    }
    else
        if(p%2==1)
        {
            inmultire(rez, rez, mat);
            for(int i=0;i<2;i++)
                for(int j=0;j<2;j++)
                    mat[i][j]=rez[i][j];
            exponentiere(p-1);
        }

}

int main()
{
    freopen("kfib.in", "r", stdin);
    freopen("kfib.out", "w", stdout);

    scanf("%d\n", &n);
    exponentiere(n-1);
    printf("%d", mat[1][1]);
    return 0;
}