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

int **malloc2d(int r, int c);

int main()
{
  int n, m, i, j;
  int **M;

  printf("Numero de linhas e colunas: ");
  scanf("%d %d", &m, &n);

  M = malloc2d(m, n);

  /* O uso da matriz M a seguir 'e apenas um exemplo */

  for (i = 0; i < m; i++)
    M[i][0] = 1;

  for (j = 1; j < n; j++)
    M[0][j] = 0;

  for (i = 1; i < m; i++)
    for (j = 1; j < n; j++)
      M[i][j] = M[i - 1][j - 1] + M[i - 1][j];

  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++)
      if (M[i][j] > 0)
	printf(" %3d", M[i][j]);
    putchar('\n');
  }

  return 0;
}

/*
 * This code is from "Algorithms in C, Third Edition,"
 * by Robert Sedgewick, Addison Wesley Longman, 1998.
 */
int **malloc2d(int r, int c)
{
  int i;
  int **t = malloc(r * sizeof(int *));
  for (i = 0; i < r; i++)
    t[i] = malloc(c * sizeof(int));
  return t;
}
