Cod sursa(job #3299479)

Utilizator rares-razvan.boldeaRares-Razvan Boldea rares-razvan.boldea Data 7 iunie 2025 02:48:53
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
typedef struct
{
  int64_t **m;
  uint32_t rows,columns;
}matrix;
matrix *matrix_create(int64_t *values,uint32_t rows,uint32_t columns)
{
  matrix *aux=(matrix*)malloc(sizeof(matrix));
  aux->rows=rows;
  aux->columns=columns;
  int64_t **m=(int64_t**)malloc(rows*sizeof(int64_t*));
  for(uint32_t i=0;i<rows;i++)
    m[i]=(int64_t*)malloc(columns*sizeof(int64_t));
  for(uint32_t i=0;i<rows*columns;i++)
    m[i/columns][i%columns]=values[i];
  aux->m=m;
  return aux;
}
matrix *matrix_mult(matrix *a,matrix *b)
{
  if(a->columns!=b->rows)
    return NULL;
  int64_t *v=(int64_t*)calloc(a->rows*b->columns,sizeof(int64_t));
  matrix *ans=matrix_create(v,a->rows,b->columns);
  free(v);
  for(uint32_t i=0;i<a->rows;i++)
    for(uint32_t j=0;j<b->columns;j++)
      for(uint32_t k=0;k<a->columns;k++)
        ans->m[i][j]+=a->m[i][k]*b->m[k][j];
  return ans;
}
void matrix_delete(matrix *a)
{
  for(uint32_t i=0;i<a->rows;i++)
    free(a->m[i]);
  free(a->m);
  free(a);
}
void matrix_print(matrix *a)
{
  for(uint32_t i=0;i<a->rows;i++)
  {
    for(uint32_t j=0;j<a->columns;j++)
      printf("%ld ",a->m[i][j]);
    printf("\n");
  }
}
matrix *matrix_exponent(matrix *a,int pow)
{
  matrix *ans,*aux,*par,*impar;
  if(a->rows!=a->columns)
    return NULL;
  
  int64_t *v=(int64_t*)calloc(a->rows*a->columns,sizeof(int64_t));
  ans=matrix_create(v,a->rows,a->columns);
  free(v);
  
  if(pow==0)
  {
    for(uint32_t i=0;i<a->rows;i++)
      ans->m[i][i]=1;
    return ans;
  }
  
  aux=matrix_exponent(a,pow/2);
  par=matrix_mult(aux,aux);
  if(pow%2)
  {
    impar=matrix_mult(a,par);
    for(int i=0;i<a->rows;i++)
      for(int j=0;j<a->rows;j++)
	ans->m[i][j]=impar->m[i][j]%666013;
    matrix_delete(impar);
  }
  else
    for(int i=0;i<a->rows;i++)
      for(int j=0;j<a->rows;j++)
	ans->m[i][j]=par->m[i][j]%666013;

  matrix_delete(par);
  matrix_delete(aux);
  
  return ans;
}
int main()
{
  FILE *in=fopen("kfib.in","r"),*out=fopen("kfib.out","w");
  int64_t v1[]={0,1,1,1},v2[]={0,1};
  matrix *z=matrix_create(v1,2,2),*m1=matrix_create(v2,1,2);
  uint32_t k;
  fscanf(in,"%d",&k);
  if(k==0)
    fprintf(out,"%ld\n",m1->m[0][0]);
  else
  {
    matrix *exp=matrix_exponent(z,k-1);
    matrix *ans=matrix_mult(m1,exp);
    fprintf(out,"%ld\n",ans->m[0][1]);
    matrix_delete(exp);
    matrix_delete(ans);
  }
  matrix_delete(z);
  matrix_delete(m1);
  fclose(in);
  fclose(out);
  return 0;
}