#include <stdio.h>
#include <string.h>
#define MAX_CHAR 256
long long int fact(long long int n)
{
return (n <= 1)? 1 :n * fact(n-1);
}
void populateAndIncreaseCount (long long int* count, char* str)
{
long long int i;
for( i = 0; str[i]; ++i )
++count[ str[i] ];
for( i = 1; i < 256; ++i )
count[i] += count[i-1];
}
void updatecount (long long int* count, char ch)
{
long long int i;
for( i = ch; i < MAX_CHAR; ++i )
--count[i];
}
long long int findRank (char* str)
{
long long int len
= strlen(str
); long long int mul = fact(len);
long long int rank = 1, i;
long long int count[MAX_CHAR] = {0}; // all elements of //count[] are initialized with 0
populateAndIncreaseCount( count, str );
for (i = 0; i < len; ++i)
{
mul /= len - i;
rank += count[ str[i] - 1] * mul;
updatecount (count, str[i]);
}
return rank;
}
int main()
{
int n;
long long int res;
char string[10];
res = 1;
while(n--){
res *= findRank(string)%23456;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2RlZmluZSBNQVhfQ0hBUiAyNTYKIApsb25nIGxvbmcgaW50IGZhY3QobG9uZyBsb25nIGludCBuKQp7CiAgICByZXR1cm4gKG4gPD0gMSk/IDEgOm4gKiBmYWN0KG4tMSk7Cn0KIHZvaWQgcG9wdWxhdGVBbmRJbmNyZWFzZUNvdW50IChsb25nIGxvbmcgaW50KiBjb3VudCwgY2hhciogc3RyKQp7CiAgICBsb25nIGxvbmcgaW50IGk7CiAKICAgIGZvciggaSA9IDA7IHN0cltpXTsgKytpICkKICAgICAgICArK2NvdW50WyBzdHJbaV0gXTsKIAogICAgZm9yKCBpID0gMTsgaSA8IDI1NjsgKytpICkKICAgICAgICBjb3VudFtpXSArPSBjb3VudFtpLTFdOwp9CiAKdm9pZCB1cGRhdGVjb3VudCAobG9uZyBsb25nIGludCogY291bnQsIGNoYXIgY2gpCnsKICAgIGxvbmcgbG9uZyBpbnQgaTsKICAgIGZvciggaSA9IGNoOyBpIDwgTUFYX0NIQVI7ICsraSApCiAgICAgICAgLS1jb3VudFtpXTsKfQogCgpsb25nIGxvbmcgaW50IGZpbmRSYW5rIChjaGFyKiBzdHIpCnsKICAgIGxvbmcgbG9uZyBpbnQgbGVuID0gc3RybGVuKHN0cik7CiAgICBsb25nIGxvbmcgaW50IG11bCA9IGZhY3QobGVuKTsKICAgIGxvbmcgbG9uZyBpbnQgcmFuayA9IDEsIGk7CiAgICBsb25nIGxvbmcgaW50IGNvdW50W01BWF9DSEFSXSA9IHswfTsgIC8vIGFsbCBlbGVtZW50cyBvZiAvL2NvdW50W10gYXJlIGluaXRpYWxpemVkIHdpdGggMAogCiBwb3B1bGF0ZUFuZEluY3JlYXNlQ291bnQoIGNvdW50LCBzdHIgKTsKIAogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQogICAgewogICAgICAgIG11bCAvPSBsZW4gLSBpOwogCiAgICAgIHJhbmsgKz0gY291bnRbIHN0cltpXSAtIDFdICogbXVsOwogCiAgICAgICAgdXBkYXRlY291bnQgKGNvdW50LCBzdHJbaV0pOwogICAgfQogCiAgICByZXR1cm4gcmFuazsKfQogCgppbnQgbWFpbigpCnsKICAgaW50IG47CiAgIGxvbmcgbG9uZyBpbnQgcmVzOwogICBjaGFyIHN0cmluZ1sxMF07CiAgIHNjYW5mKCIlZCIsICZuKTsKICAgcmVzID0gMTsKICAgd2hpbGUobi0tKXsKICAgICAgc2NhbmYoIiVzIixzdHJpbmcpOwogICAgICAgcmVzICo9IGZpbmRSYW5rKHN0cmluZyklMjM0NTY7CiAgIH0KICAgcHJpbnRmICgiJWxsZFxuIiwgcmVzJTIzNDU2KTsKICAgcmV0dXJuIDA7Cn0=