Problem:
Score : 300 points

Problem Statement

Takahashi is standing on a multiplication table with infinitely many rows and columns.

The square (i,j) contains the integer i \times j. Initially, Takahashi is standing at (1,1).

In one move, he can move from (i,j) to either (i+1,j) or (i,j+1).

Given an integer N, find the minimum number of moves needed to reach a square that contains N.

Constraints

2 \leq N \leq 10^{12}

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the minimum number of moves needed to reach a square that contains the integer N.

Sample Input 1

10

Sample Output 1

5

(2,5) can be reached in five moves. We cannot reach a square that contains 10 in less than five moves.

Sample Input 2

50

Sample Output 2

13

(5, 10) can be reached in 13 moves.

Sample Input 3

10000000019

Sample Output 3

10000000018

Both input and output may be enormous.

Solution in PyPy3 (2.4.0) (judge verdict: Wrong Answer)

import sys
input = sys.stdin.readline

N = int(input())


def main():
    factorized = factorizer(N)

    A = 1
    B = 1
    for k in factorized:
        while factorized[k] > 0:

            patternA = (A * k) + B
            patternB = A + (B * k)
            patternC = (A * B) + k
            patternmin = min(patternA, patternB, patternC)
            # print("patternA:{0} patternB:{1} patternC:{2} patternmin{3}".format(patternA,patternB,patternC,patternmin))

            if patternmin == patternA:
                A *= k
            elif patternmin == patternB:
                B *= k
            elif patternmin == patternC:
                A = A * B
                B = k

            factorized[k] -= 1
            # print("A,B: {0},{1}".format(A, B))
    print(A + B - 2)


def factorizer(n):
    """
    素因数分解するということは、
    2 ~ Nまでの数で割り続けるということ　試し割り
    割れなくなったら次の数で割る。
    素数を除いて、素因数の最大値は√nなので、それを超えたらやめる
    """
    res = {1: 1}  # １は必ずある
    calcEnd = n ** 0.5

    for i in range(2, int(calcEnd) + 2, 1):
        while n % i == 0:
            if res.get(i) is None:
                res[i] = 1
            else:
                res[i] += 1
            n /= i
            # print("n:{0}".format(n))

    # GCDが素数だった時の処理
    if n > 1:
        res[int(n)] = 1

    # print("res is {}".format(res))
    return res


if __name__ == '__main__':
    main()