public int[] getNext () {

 if (numLeft.equals (total)) {
   numLeft = numLeft.subtract (BigInteger.ONE);
   return a;
 }

 int temp;

 // Find largest index j with a[j] < a[j+1]

 int j = a.length - 2;
 while (a[j] > a[j+1]) {
   j--;
 }

 // Find index k such that a[k] is smallest integer
 // greater than a[j] to the right of a[j]

 int k = a.length - 1;
 while (a[j] > a[k]) {
   k--;
 }

 // Interchange a[j] and a[k]

 temp = a[k];
 a[k] = a[j];
 a[j] = temp;

 // Put tail end of permutation after jth position in increasing order

 int r = a.length - 1;
 int s = j + 1;

 while (r > s) {
   temp = a[s];
   a[s] = a[r];
   a[r] = temp;
   r--;
   s++;
 }

 numLeft = numLeft.subtract (BigInteger.ONE);
 return a;

}