Cod sursa(job #1861803)

Utilizator nnnmmmcioltan alex nnnmmm Data 29 ianuarie 2017 12:19:48
Problema Al k-lea termen Fibonacci Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
#include<cstring>

const int MOD=666013;

void inmultire(int rasp[2][2],int a[2][2],int b[2][2])
{
 for(int i=0;i<2;i++)
     for(int j=0;j<2;j++)
         for(int k=0;k<2;k++)
             rasp[i][j]=(rasp[i][j]+(1LL*a[i][k]*b[k][j])%MOD)%MOD;
}

void copiere(int source[2][2],int destination[2][2])
{
 memcpy(destination,source,4*(sizeof (int)));
}

void put(int a[2][2],int rasp[2][2],int k)
{
 if(k==0)
    {
     rasp[0][0]=rasp[1][1]=1;
     return;
    }
 if(k==1)
    {
     copiere(a,rasp);
     return;
    }
 int b[2][2],c[2][2];
 memset(b,0,sizeof b);
 memset(c,0,sizeof c);
 put(a,b,k/2);
 inmultire(c,b,b);
 if(k%2==1)
    inmultire(rasp,a,c);
 else
    copiere(c,rasp);
}

int Z[2][2]={{0,1},{1,1}};
int M0[2][2]={{1,1},{0,0}};

int main()
{
 FILE *in=fopen("kfib.in","r");
 int k;
 fscanf(in,"%d ",&k);
 fclose(in);
 int rasp[2][2],aux[2][2];
 memset(rasp,0,sizeof rasp);
 put(Z,rasp,k-1);
 copiere(rasp,aux);
 memset(rasp,0,sizeof rasp);
 inmultire(rasp,M0,aux);
 FILE *out=fopen("kfib.out","w");
 fprintf(out,"%d\n",rasp[0][0]);
 fclose(out);
 return 0;
}