Cod sursa(job #549983)

Utilizator rusu_raduRusu Radu rusu_radu Data 9 martie 2011 09:30:07
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <cassert>
#define Nmax 5
#define Mod 666013
#define InFile "kfib.in"
#define OutFile "kfib.out"
#define ll long long

using namespace std;

int k;
int sol[Nmax][Nmax];
int a[Nmax][Nmax];

void Power (int);
void inmult (int A[Nmax][Nmax], int B[Nmax][Nmax]);

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  scanf ("%d\n", &k);
  Power (k-1);
  printf ("%d\n", sol[2][2]);
  return 0;
}

void Power (int pt)
{
  int i;
  sol[1][1]=1; sol[2][2]=1;
  a[1][1]=0; a[1][2]=a[2][1]=a[2][2]=1;
  for (i=0; (1<<i)<=pt; i++)
  {
    if (pt&(1<<i))
      inmult (sol, a);
    inmult (a, a);
  }
}

void inmult (int A[Nmax][Nmax], int B[Nmax][Nmax])
{
  int i, j, k, sum;
  int C[Nmax][Nmax];
  C[1][1]=C[1][2]=C[2][1]=C[2][2]=0;
  for (i=1; i<=2; i++)
    for (j=1; j<=2; j++)
    {
      sum=0;
      for (k=1; k<=2; k++)
        sum=(sum+(ll)A[i][k]*B[k][j])%Mod;
      C[i][j]=sum;
    }
  for (i=1; i<=2; i++)
    for (j=1; j<=2; j++)
      A[i][j]=C[i][j];
}