/* * Parke Godfrey */ import java.util.Scanner; import java.io.PrintStream; import java.util.Arrays; class Element { public final char letter; public final int id; public int count; public Element(char c, int i) { letter = c; id = i; count = 1; } } public class Permalex { private static Element[] sig; private static char[] letters; private static void showSig() { for (int i = 0; i < sig.length; i++) System.out.printf("%c%d", sig[i].letter, sig[i].count); System.out.printf("\n"); } private static int gcd(int x, int y) { if (x >= y) { if ((x % y) == 0) return y; else return gcd(y, x % y); } else { if ((y % x) == 0) return x; else return gcd(x, y % x); } } private static long perms() { long product = 1; int fLen = 0; for (int i = 0; i < sig.length; i++) fLen += sig[i].count; int[] factor = new int[fLen]; for (int i = 0; i < factor.length; i++) factor[i] = i + 1; int d; for (int i = 0; i < sig.length; i++) { for (int n = 2; n <= sig[i].count; n++) { int f = n; for (int j = 0; j < factor.length; j++) { if (factor[j] > 1) { d = gcd(factor[j], f); if (d > 1) { factor[j] /= d; f /= d; } } if (f == 1) break; } } } for (int i = 0; i < factor.length; i++) product *= factor[i]; return product; } /* private static long factorial(int i) { if (i == 0) return 1; else return i * factorial(i - 1); } private static long perms() { long repeats = 1; int total = 0; for (int i = 0; i < sig.length; i++) { repeats *= factorial(sig[i].count); total += sig[i].count; } return factorial(total) / repeats; } */ public static void main(String[] args) { Scanner input = new Scanner(System.in); PrintStream output = System.out; // Walk the input words to test. String word = input.nextLine(); letters = word.toCharArray(); while (letters[0] != '#') { char[] sequence = letters.clone(); Arrays.sort(sequence); // Make a signature of the letters and their counts. int counter = 1; for (int i = 1; i < sequence.length; i++) if (sequence[i-1] != sequence[i]) counter++; sig = new Element[counter]; sig[0] = new Element(sequence[0], 0); int j = 0; for (int i = 1; i < sequence.length; i++) { // output.printf("%d: %c\n", j, sequence[i]); if (sequence[i-1] != sequence[i]) { j++; sig[j] = new Element(sequence[i], j); } else { sig[j].count++; } } long index = 1; for (int i = 0; i < letters.length; i++) { for (j = 0; sig[j].letter < letters[i]; j++) { if (sig[j].count > 0) { sig[j].count--; // showSig(); index += perms(); // output.println(index); sig[j].count++; } } j = 0; while (sig[j].letter != letters[i]) j++; sig[j].count--; } // Print out the result. output.printf("%10d\n", index); // Next word. word = input.nextLine(); letters = word.toCharArray(); } } }