// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 153 C++ */ // Send to judge@uva.es #include #include #include #include #ifdef ONLINE_JUDGE #define ins cin #define outs cout #else #define ins fin #define outs fout ifstream fin("myprog.in"); ofstream fout("myprog.out"); #endif #include #include #include #define ALPHANUM 32 char str[256]; int cstr[ALPHANUM], len; int freq[ALPHANUM]; int npr(); int gcf(int a, int b); int before(int c); int main() { int i; for(;;) { ins >> str; if(str[0] == '#') break; for(i = 0; i < ALPHANUM; i++) freq[i] = 0; len = strlen(str); for(i = 0; i < len; i++) { cstr[i] = str[i] - 'a'; freq[cstr[i]]++; } outs << setw(10) << before(0) + 1 << endl; } return 0; } int before(int c) { int sum = 0, i; if(c >= len) return 0; for(i = 0; i < cstr[c]; i++) { if(freq[i] <= 0) continue; freq[i]--; sum += npr(); freq[i]++; } freq[cstr[c]]--; return sum + before(c + 1); } int gcf(int a, int b) { int t; while(a > 0) { if(a < b) { t = a; a = b; b = t; } a = a % b; } return b; } // Calculates factorial without overflow. int npr() { int sum = 0; int i, f; int m[ALPHANUM]; for(i = 0; i < ALPHANUM; i++) sum += freq[i]; if(sum <= 1) return 1; for(i = 0; i < sum; i++) m[i] = i + 1; for(i = 0; i < ALPHANUM; i++) { if(freq[i] > 1) { for(int j = 1; j <= freq[i]; j++) { f = j; for(int k = 0; k < sum; k++) { int g = gcf(f, m[k]); if(g > 1) { m[k] /= g; f /= g; } if(f == 1) break; } } } } f = 1; for(i = 0; i < sum; i++) f *= m[i]; return f; } // @END_OF_SOURCE_CODE