Cod sursa(job #2622604)

Utilizator euyoTukanul euyo Data 1 iunie 2020 16:07:09
Problema Al k-lea termen Fibonacci Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#define MOD 666013

int M[2][2] = {{0, 1}, {1, 1}}; //baza
int P[2][2] = {{1, 1}, {1, 1}}; //puterea intermediara
int rez[2][2]; //rezultatul inmultirii
int F[1][2] = {{0, 1}};


void mul( int A[2][2], int B[2][2], int n, int m, int l ) { //n x m, m x l
  int i, j, k;
  
  for ( i = 0; i < 2; ++i ) {
    for ( j = 0; j < 2; ++j ) {
	  rez[i][j] = 0; 
	}
  }
  for ( i = 0; i < n; ++i ) {
    for ( j = 0; j < l; ++j ) {
	  for ( k = 0; k < m; ++k ) {
		rez[i][j] = (rez[i][j] + 1LL * A[i][k] * B[k][j]) % MOD;
	  }
	}
  }
}
void moveAtoB( int A[2][2], int B[2][2], int n, int m ) {
  int i, j;

  for ( i = 0; i < n; ++i ) {
	for ( j = 0; j < m; ++j ) {
	  B[i][j] = A[i][j];
	}
  }
}
void quickExp( int n ) {
  while ( n > 0 ) {
    if ( n % 2 == 1 ) {
      mul( P, M, 2, 2, 2 );
      moveAtoB( rez, P, 2, 2 );
    }	    
	mul( M, M, 2, 2, 2 );
	moveAtoB( rez, M, 2, 2 );
    n /= 2;
  }
}

int main() {
  FILE *fin = fopen( "kfib.in", "r" );
  FILE *fout = fopen( "kfib.out", "w" ); 
  int n, i, j;
    
  fscanf( fin, "%d", &n );
  quickExp( n - 1 );
  mul( F, P, 1, 2, 2 );
  for ( i = 0; i < 2; ++i ) {
	for ( j = 0; j < 2; ++j ) {
      printf( "%d ", P[i][j] );
	}
	printf( "\n" );
  }
  fprintf( fout, "%d", rez[0][0] );
  fclose( fin );
  fclose( fout );
  return 0;
}