Cod sursa(job #1914588)

Utilizator Radu_GeorgeRadu George Radu_George Data 8 martie 2017 17:33:33
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
#define MOD 666013

using namespace std;

int a[3][3],b[3][3],sol[3][3];

inline void Copy(int a[][3], int b[][3])
{
    for(int i=1;i<=2;++i)
        for(int j=1;j<=2;++j) a[i][j]=b[i][j];
}

inline void Mult_mat(int a[][3], int b[][3])
{
    int c[3][3],i,j,k;

    for(i=1;i<=2;++i)
        for(j=1;j<=2;++j)
            for(c[i][j]=0,k=1;k<=2;++k) c[i][j]=(1LL*a[i][k]*b[k][j] + c[i][j])%MOD;

    Copy(a,c);
}

inline void Pow_Log(int a[][3], int p)
{
    sol[1][1]=sol[2][2]=1;
    while(p)
    {
        if(p&1)
        {
            Mult_mat(sol,a); --p;
        }
        Mult_mat(a,a); p>>=1;
    }
    Copy(a,sol);
}

int main()
{
    int n;
    ifstream cin("kfib.in");
    ofstream cout("kfib.out");
    cin>>n;
    if(!n)
    {
        cout<<"0\n";
        return 0;
    }
    if(n==1)
    {
        cout<<"1\n";
        return 0;
    }

    a[1][1]=0; a[1][2]=1;
    b[1][1]=0; b[2][1]=1;
    b[1][2]=b[2][2]=1;

    Pow_Log(b,n-1);
    Mult_mat(a,b);

    cout<<a[1][2]<<"\n";
    return 0;
}