
public class Miscellaneous {


  // Programmazione dinamica: percorsi di Manhattan
  
  public static int manhattan( int i, int j ) {
  
    int[][] paths = new int[i+1][j+1];
    int u, v;
    
    for (u=0; u<=i; u=u+1) {
      paths[u][0] = 1;
    }
    for (v=1; v<=j; v=v+1) {
      paths[0][v] = 1;
    }
    for (u=1; u<=i; u=u+1) {
      for (v=1; v<=j; v=v+1) {
        paths[u][v] = paths[u-1][v] + paths[u][v-1];
      }
    }
    return paths[i][j];
  }
  
  
  // Valori vettoriali: coefficienti binomiali
  
  public static int[] binomial( int n ) {
  
    int[] row = new int[n+1];
    int i, k;
    
    row[0] = 1;
    for (k=1; k<=n; k=k+1) {
      row[k] = 1;
      for (i=k-1; i>0; i=i-1) {
        row[i] = row[i-1] + row[i];
      }
    }
    return row;
  }
  
  
  // Passaggio parametri: crivello di Eratostene
  
  public static int[] sieve( int n ) {
  
    boolean[] candidate = new boolean[n+1];
    int p, primes = 0;
    
    for (p=2; p<=n; p=p+1) {
      candidate[p] = true;
    }
    for (p=2; p<=n; p=p+1) {
      if (candidate[p]) {
        filter(p,candidate);
        primes = primes + 1;
      }
    }
    int[] prime = new int[primes];
    int k = 0;
    for (p=2; p<=n; p=p+1) {
      if (candidate[p]) {
        prime[k] = p;
        k = k + 1;
      }
    }
    return prime;
  }
  
  public static void filter( int p, boolean[] candidate ) {
  
    for (int q=2*p; q<candidate.length; q=q+p) {
      candidate[q] = false;
    }
  }
  
  
  // Verifiche
  
  public static void main( String[] args ) {
  
    int i, j, k, tab = 5;
    String number;
    int[] bin, prime;
    
    System.out.println();
    
    for (i=0; i<=5; i=i+1) {
      for (j=0; j<=5; j=j+1) {
      
        number = " " + manhattan(i,j);
        
        for (k=number.length()+1; k<=tab; k=k+1) {
          number = " " + number;
        }
        System.out.print(number);
      }
      System.out.println();
    }
    
    System.out.println();
    
    for (i=0; i<=10; i=i+1) {
    
      bin = binomial(i);
      
      for (j=0; j<bin.length; j=j+1) {
      
        number = " " + bin[j];
        
        for (k=number.length()+1; k<=tab; k=k+1) {
          number = " " + number;
        }
        System.out.print(number);
      }
      System.out.println();
    }
    
    System.out.println();
    
    prime = sieve(100);
    
    for (i=0; i<prime.length; i=i+1) {
      
      number = " " + prime[i];
        
      for (k=number.length()+1; k<=tab; k=k+1) {
        number = " " + number;
      }
      if ( (i+1) % 10 == 0 ) {
        System.out.println(number);
      } else {
        System.out.print(number);
      }
    }
    System.out.println();
  }

}
