| Task: | Kertoma | 
| Sender: | Leipaviipale | 
| Submission time: | 2022-11-04 17:07:38 +0200 | 
| Language: | Python3 (CPython3) | 
| Status: | READY | 
| Result: | 46 | 
| group | verdict | score | 
|---|---|---|
| #1 | ACCEPTED | 22 | 
| #2 | ACCEPTED | 24 | 
| #3 | TIME LIMIT EXCEEDED | 0 | 
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #2 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #3 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #4 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #5 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #6 | ACCEPTED | 0.28 s | 1, 2, 3 | details | 
| #7 | ACCEPTED | 0.28 s | 2, 3 | details | 
| #8 | ACCEPTED | 0.28 s | 2, 3 | details | 
| #9 | ACCEPTED | 0.28 s | 2, 3 | details | 
| #10 | ACCEPTED | 0.28 s | 2, 3 | details | 
| #11 | ACCEPTED | 0.29 s | 3 | details | 
| #12 | ACCEPTED | 0.30 s | 3 | details | 
| #13 | ACCEPTED | 0.60 s | 3 | details | 
| #14 | TIME LIMIT EXCEEDED | -- | 3 | details | 
| #15 | TIME LIMIT EXCEEDED | -- | 3 | details | 
| #16 | TIME LIMIT EXCEEDED | -- | 3 | details | 
Code
import math
# 0 0 1 => 2
# 1 1 1 0 0 0 0 0 0 0 => 5
# 42 25 24 16 15 16 21 14 17 16 => 123
# 2 0 1 1 0 0 1 0 2 0 => 10
def main():
    input_array = get_input()
    INPUT_DIGIT_COUNT = sum(input_array)
    # magic number that represents the maximum amount of digits, if you calculate (10*10^5)! 
    # 10*10^5 means the maxkimum amount of input digits in subtask 3
    UPPER_X_BOUND = 210000      
    min_guess = 2
    max_guess = UPPER_X_BOUND
    while(True):
        average = round((max_guess - min_guess) / 2) + min_guess
        guess_digit_count = get_factorial_digit_count(average)
        if (guess_digit_count < INPUT_DIGIT_COUNT):
            min_guess = average
        elif (guess_digit_count > INPUT_DIGIT_COUNT):
            max_guess = average
        else:
            result = increase_accuracy(average, input_array, INPUT_DIGIT_COUNT)
            print(result)
            break
def get_input():
    x = input().split()
    return [eval(i) for i in x]
def get_factorial_digit_count(number : int) -> int:
    # if negative or less than 2 => automatically has only 1 digit
    if (number < 2): return 1   
    return math.floor(math.log10(math.factorial(number))) + 1
def count_specific_digit(number : int, digit : str) -> int:
    return str(number).count(str(digit))
# check if number matches input array
def try_match(guess : int, input_array) -> bool:
    factorial = math.factorial(guess)
    for i in range(len(input_array)):
        count = count_specific_digit(factorial, i)
        if (input_array[i] != count):
            return -1
        if (i == len(input_array) - 1):
            return guess
def increase_accuracy(guess : int, input_array, input_digit_count : int) -> int:
    # digit count should not match even the close numbers
    if (guess > 200): return guess
    if (try_match(guess, input_array) != -1): 
        return guess
    wannabe_guess = guess - 1
    while (get_factorial_digit_count(wannabe_guess) == input_digit_count):
        if (try_match(wannabe_guess, input_array)): 
            return wannabe_guess
        wannabe_guess -= 1
    wannabe_guess = guess + 1
    while (get_factorial_digit_count(wannabe_guess) == input_digit_count):
        if (try_match(wannabe_guess, input_array)): 
            return wannabe_guess
        wannabe_guess += 1
    raise ValueError(f"Cannot find value for input array {input_array}")
main()Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 0 0 1 0 0 0 0 0 0 0 | 
| correct output | 
|---|
| 2 | 
| user output | 
|---|
| 2 | 
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 0 0 0 0 0 0 1 0 0 0 | 
| correct output | 
|---|
| 3 | 
| user output | 
|---|
| 3 | 
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 0 0 1 0 1 0 0 0 0 0 | 
| correct output | 
|---|
| 4 | 
| user output | 
|---|
| 4 | 
Test 4
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 2 0 1 1 0 0 1 0 2 0 | 
| correct output | 
|---|
| 10 | 
| user output | 
|---|
| 10 | 
Test 5
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 9 3 1 1 2 2 3 1 6 1 | 
| correct output | 
|---|
| 27 | 
| user output | 
|---|
| 27 | 
Test 6
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 10 4 3 4 3 2 2 4 3 7 | 
| correct output | 
|---|
| 36 | 
| user output | 
|---|
| 36 | 
Test 7
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 71 53 36 30 25 29 42 24 34 29 | 
| correct output | 
|---|
| 199 | 
| user output | 
|---|
| 199 | 
Test 8
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 71 33 46 38 27 45 36 21 35 35 | 
| correct output | 
|---|
| 205 | 
| user output | 
|---|
| 205 | 
Test 9
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 93 38 35 26 43 54 38 25 41 34 | 
| correct output | 
|---|
| 222 | 
| user output | 
|---|
| 222 | 
Test 10
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 33 33 45 36 43 38 54 56 36 | 
| correct output | 
|---|
| 242 | 
| user output | 
|---|
| 242 | 
Test 11
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 3419 1797 1845 1849 1879 1791 ... | 
| correct output | 
|---|
| 5959 | 
| user output | 
|---|
| 5959 | 
Test 12
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 4776 2695 2709 2781 2616 2753 ... | 
| correct output | 
|---|
| 8391 | 
| user output | 
|---|
| 8391 | 
Test 13
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 20097 12282 12229 12214 12406 ... | 
| correct output | 
|---|
| 32001 | 
| user output | 
|---|
| 32001 | 
Test 14
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 47934 29918 29878 29713 29984 ... | 
| correct output | 
|---|
| 71718 | 
| user output | 
|---|
| (empty) | 
Test 15
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 84691 54156 54277 54533 54296 ... | 
| correct output | 
|---|
| 123123 | 
| user output | 
|---|
| (empty) | 
Test 16
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 99098 63339 63878 64182 63904 ... | 
| correct output | 
|---|
| 142663 | 
| user output | 
|---|
| (empty) | 
