Cod sursa(job #978314)

Utilizator andrettiAndretti Naiden andretti Data 28 iulie 2013 17:00:17
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
#define mod 666013
using namespace std;

int k;
int sol[3][3],add[3][3];

void init()
{
    add[1][2]=add[2][1]=add[2][2]=1;
    sol[1][1]=sol[2][2]=1;
}

void up(int a[3][3],int b[3][3])
{
    int aux[3][3];
    int i,j,l;

    for(i=1;i<=2;i++)
     for(j=1;j<=2;j++)
      aux[i][j]=0;

    for(i=1;i<=2;i++)
     for(j=1;j<=2;j++)
      for(l=1;l<=2;l++)
       aux[i][j]+=(1LL*a[i][l]*b[l][j])%mod,aux[i][j]%=mod;

    for(i=1;i<=2;i++)
     for(j=1;j<=2;j++)
      a[i][j]=aux[i][j];
}

void solve()
{
    k--;
    for(int i=0;(k>>i);i++)
    {
        if( ((k>>i)&1)==1 ) up(sol,add);
        up(add,add);
    }
}

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

    scanf("%d",&k);
    init();
    solve();
    if(k+1) printf("%d",sol[2][2]);
    else printf("0");

    fclose(stdin);
    fclose(stdout);
    return 0;
}