Cod sursa(job #1602289)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 16 februarie 2016 18:21:43
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <iostream>
#include <cstring>
#define mod 666013
using namespace std;

int numarul;
int sol[2];

inline void mult(int a[3][3],int b[3][3],int c[3][3])
{
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
            for(k=0;k<2;k++)
                c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j])%mod;


}

inline int put(int p)
{
    int i;
    int a[3][3],aux[3][3],b[3][3],sol[3][3];
    a[0][0]=0; a[0][1]=a[1][0]=a[1][1]=1;
    sol[0][0]=sol[1][1]=1; sol[0][1]=sol[1][0]=0;
    for(i=0;(1<<i)<=p;i++)
    {
        if((1<<i)&p)
        {
            memset(aux,0,sizeof(aux));
            mult(a,sol,aux);
            memcpy(sol,aux,sizeof(aux));
        }
        memcpy(b,a,sizeof(a));
        memset(aux,0,sizeof(aux));
        mult(b,a,aux);
        memcpy(a,aux,sizeof(aux));
       // cout<<a[0][0]<<' '<<a[0][1]<<'\n'<<a[1][0]<<' '<<a[1][1]<<'\n'<<'\n';
        //cout<<sol[0][0]<<' '<<sol[0][1]<<'\n'<<sol[1][0]<<' '<<sol[1][1]<<'\n'<<'\n';
    }
    return (sol[0][0]+sol[1][0])%mod;
}

int main()
{
    freopen("kfib.in","r",stdin);
    freopen("kfib.out","w",stdout);
    scanf("%d",&numarul);
    printf("%d\n",put(numarul-1));
    fclose(stdin);
    fclose(stdout);
    return 0;
}