#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void removefibas(int* arr, int* size, int index) {
  if (index >= 0 && index < *size) {
    for (int i = index; i < *size - 1; ++i) {
      arr[i] = arr[i + 1];
    }
    (*size)--;
  }
}

int main() {
  int n = 0, m = 0;
  printf("enter long and width of the matrix: \n");
  scanf("%d %d", &n, &m);
  int** mat = malloc(sizeof(int*) * m);
  for (int i = 0; i < n; i++) {
    mat[i] = malloc(sizeof(int) * n);
  }

  // Динамическое выделение памяти для массива fiba
  int* fiba = malloc(sizeof(int) * 100); // Выделяем достаточно памяти
  fiba[0] = 0;
  fiba[1] = 1;
  int fiba_count = 2;

  while (fiba[fiba_count - 1] < 320000) {
    fiba[fiba_count] = fiba[fiba_count - 1] + fiba[fiba_count - 2];
    fiba_count++;
  }

  srand(time(NULL));

  int ran = 0;
  fiba_count -= 1;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      ran = rand() % (fiba_count);
      mat[i][j] = fiba[ran];
      removefibas(fiba, &fiba_count, ran);
      fiba_count--;
    }
    if (fiba_count < 0) {
      printf("its too much numbers in matrix\n");
      return 0;
    }
  }

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      printf("%d ", mat[i][j]);
    }
    printf("\n");
  }

  // Освобождаем память
  free(fiba); // Освобождаем память для fiba
  for (int i = 0; i < n; i++) {
    free(mat[i]);
  }
  free(mat);

  return 0;
}

