Cod sursa(job #877952)

Utilizator vlcmodanModan Valentin vlcmodan Data 13 februarie 2013 15:59:43
Problema Al k-lea termen Fibonacci Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
//#include <iostream>
#include<stdio.h>
using namespace std;
long a[3][3],b[3][3],i,j,n;
void patrat()
{
    long x[3][3],i,j;
    x[1][1]=a[1][1]*a[1][1]+a[2][1]*a[1][2];
    x[1][2]=a[1][2]*(a[1][1]+a[2][2]);
    x[2][1]=a[2][1]*(a[1][1]+a[2][2]);
    x[2][2]=a[1][2]*a[2][1]+a[2][2]*a[2][2];
    for(i=1;i<=2;i++)
    for(j=1;j<=2;j++)
    a[i][j]=x[i][j]%666013;
}
void produs()
{
 long x[3][3],i,j;

    x[1][1]=a[1][1]*b[1][1]+b[2][1]*a[1][2];
    x[1][2]=a[1][1]*b[1][2]+a[1][2]*b[2][2];
    x[2][1]=a[2][1]*b[1][1]+a[2][2]*b[2][1];
    x[2][2]=b[1][2]*a[2][1]+a[2][2]*b[2][2];
    for(i=1;i<=2;i++)
    for(j=1;j<=2;j++)
    a[i][j]=x[i][j]%666013;
}
void fib(int x)
{

    if(x!=1)
    {


    fib(x/2);
    if(x%2==0)


     patrat();
    else
    {
        patrat();
        produs();
    }



    }
}
int main()
{
  freopen("kfib.in","r",stdin);
  freopen("kfib.out","w",stdout);
  scanf("%d",&n);
  a[2][1]=1;a[1][2]=1;
  a[2][2]=1;
  b[2][1]=1;
  b[1][2]=1;
  b[2][2]=1;
  fib(n);
   /*for(i=1;i<=2;i++)
    for(j=1;j<=2;j++)
    printf("%d",a[i][j]);
*/
printf("%ld\n",a[1][2]%666013);
    return 0;
}