/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static int calc(int number) {
// edge case
if (number == 0) {
return 1;
}
int[] digitCount = new int[10];
int[] digitFactorial = new int[10];
int maxDigit = 0;
int result = 0;
int runNumber = number;
// convert number to digit counters
while(runNumber > 0) {
int digit = runNumber % 10;
digitCount[digit]++;
if (maxDigit < digit) {
maxDigit = digit;
}
runNumber /= 10;
}
// calculate required factorials
digitFactorial[0] = 1;
for(int i=1; i <= maxDigit; i++) {
digitFactorial[i] = digitFactorial[i-1] * i;
}
// calculate sum
for(int i=0; i <= maxDigit; i++) {
result += (digitFactorial[i] * digitCount[i]);
}
// debug
//System.out.printf("Number: %d, Factorials: %s, Counts: %s%n", number,
// Arrays.toString(digitFactorial),
// Arrays.toString(digitCount));
return result;
}
private static void test(int testId, int number, int expectedValue) {
int result = calc(number);
if (result == expectedValue) {
System.
out.
printf("Test %d: OK%n", testId
); } else {
System.
out.
printf("Test %d: failed, expected %d, result %d%n", testId, expectedValue, result
); }
}
{
test(1, 0, 1);
test(2, 1, 1);
test(3, 101, 3);
test(4, 2, 2);
test(5, 3, 6);
test(6, 4, 24);
test(7, 9, 362880);
test(8, 91, 362880+1);
test(9, 912, 362880+1+2);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXByaXZhdGUgc3RhdGljIGludCBjYWxjKGludCBudW1iZXIpIHsKCSAgLy8gZWRnZSBjYXNlCgkgIGlmIChudW1iZXIgPT0gMCkgewoJICAJcmV0dXJuIDE7CgkgIH0JCgkgIAoJICBpbnRbXSBkaWdpdENvdW50ID0gbmV3IGludFsxMF07CgkgIGludFtdIGRpZ2l0RmFjdG9yaWFsID0gbmV3IGludFsxMF07CgkgIGludCBtYXhEaWdpdCA9IDA7CgkgIGludCByZXN1bHQgPSAwOwoJICBpbnQgcnVuTnVtYmVyID0gbnVtYmVyOwoKCSAgLy8gY29udmVydCBudW1iZXIgdG8gZGlnaXQgY291bnRlcnMJCgkgIHdoaWxlKHJ1bk51bWJlciA+IDApIHsKCSAgCWludCBkaWdpdCA9IHJ1bk51bWJlciAlIDEwOwoJICAJZGlnaXRDb3VudFtkaWdpdF0rKzsKCSAgCWlmIChtYXhEaWdpdCA8IGRpZ2l0KSB7CgkgIAkJbWF4RGlnaXQgPSBkaWdpdDsKCSAgCX0KCSAgCXJ1bk51bWJlciAvPSAxMDsKCSAgfQoKICAgICAgLy8gY2FsY3VsYXRlIHJlcXVpcmVkIGZhY3RvcmlhbHMJICAKCSAgZGlnaXRGYWN0b3JpYWxbMF0gPSAxOwoJICBmb3IoaW50IGk9MTsgaSA8PSBtYXhEaWdpdDsgaSsrKSB7CgkgIAlkaWdpdEZhY3RvcmlhbFtpXSA9IGRpZ2l0RmFjdG9yaWFsW2ktMV0gKiBpOwoJICB9CgkgIAoJICAvLyBjYWxjdWxhdGUgc3VtCgkgIGZvcihpbnQgaT0wOyBpIDw9IG1heERpZ2l0OyBpKyspIHsKCSAgCXJlc3VsdCArPSAoZGlnaXRGYWN0b3JpYWxbaV0gKiBkaWdpdENvdW50W2ldKTsKCSAgfQoKICAgICAgLy8gZGVidWcJICAKCSAgLy9TeXN0ZW0ub3V0LnByaW50ZigiTnVtYmVyOiAlZCwgRmFjdG9yaWFsczogJXMsIENvdW50czogJXMlbiIsIG51bWJlciwgCgkgIC8vICBBcnJheXMudG9TdHJpbmcoZGlnaXRGYWN0b3JpYWwpLCAKCSAgLy8gIEFycmF5cy50b1N0cmluZyhkaWdpdENvdW50KSk7CgkgICAgCgkgIHJldHVybiByZXN1bHQ7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdChpbnQgdGVzdElkLCBpbnQgbnVtYmVyLCBpbnQgZXhwZWN0ZWRWYWx1ZSkgewoJCWludCByZXN1bHQgPSBjYWxjKG51bWJlcik7CgkJaWYgKHJlc3VsdCA9PSBleHBlY3RlZFZhbHVlKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRmKCJUZXN0ICVkOiBPSyVuIiwgdGVzdElkKTsKCQl9IGVsc2UgewoJCQlTeXN0ZW0ub3V0LnByaW50ZigiVGVzdCAlZDogZmFpbGVkLCBleHBlY3RlZCAlZCwgcmVzdWx0ICVkJW4iLCB0ZXN0SWQsIGV4cGVjdGVkVmFsdWUsIHJlc3VsdCk7CgkJfQoJfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQl0ZXN0KDEsIDAsIDEpOwoJCXRlc3QoMiwgMSwgMSk7CgkJdGVzdCgzLCAxMDEsIDMpOwoJCXRlc3QoNCwgMiwgMik7CgkJdGVzdCg1LCAzLCA2KTsKCQl0ZXN0KDYsIDQsIDI0KTsKCQl0ZXN0KDcsIDksIDM2Mjg4MCk7CgkJdGVzdCg4LCA5MSwgMzYyODgwKzEpOwoJCXRlc3QoOSwgOTEyLCAzNjI4ODArMSsyKTsKCX0KfQ==