Cod sursa(job #1202670)

Utilizator xtreme77Patrick Sava xtreme77 Data 28 iunie 2014 23:58:41
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>

#define i64 long long
const char IN[]="kfib.in";
const char OUT[]="kfib.out";
const int MAX = 2;
const int MOD = 666013;
#define op %MOD
using namespace std;

i64 sol[MAX][MAX],aux[MAX][MAX];
inline void mulmat(i64 a[][MAX],i64 b[][MAX]);
inline int putlog(int n);
int main( )
{
    int k;
    freopen( IN , "r"  , stdin );
    freopen( OUT , "w" , stdout );
    scanf("%d",&k);
    printf("%d\n",putlog(k));
    return 0;
}
inline void mulmat(i64 a[][MAX],i64 b[][MAX])
{
    i64 aa,bb,c,d;
    aa=(a[0][0]*b[0][0]+ a[0][1]*b[1][0])op;
    bb=(a[0][0]*b[0][1]+ a[0][1]*b[1][1])op;
    c=( a[1][0]*b[0][0]+ a[1][1]*b[1][0])op;
    d=( a[1][0]*b[0][1]+ a[1][1]*b[1][1])op;
    a[0][0]=aa;a[0][1]=bb;a[1][0]=c;a[1][1]=d;
}
inline int putlog(int n)
{
    aux[0][1]=aux[1][0]=aux[1][1]=sol[0][0]=sol[1][1]=1;
    for(;n;n>>=1){
        if(n&1)mulmat(sol,aux);
        mulmat(aux,aux);
    }
    return sol[0][1];
}