Cod sursa(job #805442)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 31 octombrie 2012 14:56:51
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <stdio.h>

using namespace std;
FILE *f=fopen("kfib.in","r");
FILE *g=fopen("kfib.out","w");
int k,nr[3][3],m;


void prod(int p1[3][3],int p2[3][3])
{

 int i,j,aux[3][3];
 long long cn;
 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 (k=1;k<=2;k++)
   {

    cn=(long long)aux[i][j]+((long long)p1[i][k]*p2[k][j])%m;
    cn=(long long)cn%m;
    aux[i][j]=cn;
   }
 for(i=1;i<=2;i++)
  for(j=1;j<=2;j++)
   p1[i][j]=aux[i][j];
}









void ridic(int k)
{
 int i;
 int p[3][3];
 p[1][1]=p[1][2]=p[2][1]=1;
 p[2][2]=0;
 nr[1][1]=nr[2][2]=1;
 for(i=0;i<=31;i++,prod(p,p))
 if(k & (1<<i))prod(nr,p);
}





int main()
{
  m=666013;
  fscanf(f,"%d",&k);
 if (k>2)
 {
 ridic(k-2);
   fprintf(g,"%d",(nr[1][1]+nr[1][2])%m);
 }
 else fprintf(g,"%d",1);

fclose(g);
return 0;
}