#define RINGS 6
 
#define max(a,b) ( (a)>(b) ?   (a)  : (b) )
#define min(a,b) ( (a)<(b) ?   (a)  : (b) )
#define abs(a)   ( (a)< 0  ? (-(a)) : (a) )  
 
main(int argc, char **argv)
{ 
  int medium_ring_size[RINGS], prev_number_of_rings[RINGS];
  int number_of_rings;
  int low_ring_size, high_ring_size, low_count, high_count;
  int first_ring_size, second_ring_size, first_count, second_count;

  int size,i_ring;

  for (i_ring=0; i_ring<RINGS; i_ring++) prev_number_of_rings[i_ring] = 0; 

  for (size=2; size<= 1024; size++)
  {

    medium_ring_size[0] =   2; 
    medium_ring_size[1] =   4; 
    medium_ring_size[2] =   8; 
    medium_ring_size[3] = max( 16, size/4); 
    medium_ring_size[4] = max( 32, size/2); 
    medium_ring_size[5] =  size; 
 
    printf("%4d",size);
    for (i_ring=0; i_ring<RINGS; i_ring++)
    {
      medium_ring_size[i_ring] = min(medium_ring_size[i_ring], size); 
      number_of_rings 
       =max(1,min((int)(1.0*size/medium_ring_size[i_ring]+0.40),size/2));
      low_ring_size = size/number_of_rings;
      high_ring_size = low_ring_size + 1;
      high_count = size - low_ring_size*number_of_rings; 
      low_count = number_of_rings - high_count;
      if ((low_ring_size%2) && (high_count>0))
       {first_ring_size=high_ring_size; second_ring_size=low_ring_size; 
        first_count=high_count;         second_count=low_count;}
      else 
       {first_ring_size=low_ring_size; second_ring_size=high_ring_size; 
        first_count=low_count;         second_count=high_count;}
         
      printf(" %3d%c",number_of_rings,
         (number_of_rings > prev_number_of_rings[i_ring] ? '^' : '.')); 
      printf("%2d*%-2d", first_count, first_ring_size);
      if (second_count>0) 
        printf("+%2d*%-2d", second_count,second_ring_size);
      else
        printf("%s",(second_ring_size>99 ? "       " : "      ")); 
      prev_number_of_rings[i_ring] = number_of_rings; 
    } 
    printf("\n");
  } 
}
