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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>
#include <bits/stdc++.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <cmath>
#define INF 1000000000000
typedef long long ll;
std::vector<ll> enum_div(ll n)//nの約数を列挙
{
	std::vector<ll> ret;
	for(ll i=1 ; i*i<=n ; ++i)
	{
		if(n%i == 0)
		{
			ret.push_back(i);
			if(i!=1 && i*i!=n)
			{
				ret.push_back(n/i);
			}
		}
	}
	ret.push_back(n);
	return ret;
}

bool is_integer( double x ){
  return std::floor(x)==x;
}

int main()
{
	ll N;
	ll cnt;
	ll wk;
	ll flg;
	flg=0;
	std::cin >> N;
	ll min;
	std::vector<ll> r = enum_div(N);
	min=INF;
	std::sort(r.begin(),r.end());//昇順ソート
	/*
	for(ll i=0;i<r.size();i++){
		printf("%lld\n",r[i]);
	}
	*/
	
	wk=sqrt(N);
	
	if(wk*wk==N){
		flg=1;
	}
	std::sort(r.begin(),r.end());//昇順ソート
	/*
	for(ll i=0;i<r.size();i++){
		printf("%lld\n",r[i]);
	}
	*/
	
	for(ll i=1;i<r.size();i++){
		if(min>r[i-1]+r[r.size()-i]-2){
			min=r[i-1]+r[r.size()-i]-2;
			//printf("%lld\n",r[i-1]);
			//printf("%lld\n",r[r.size()-i]);
		}

	}
	
	if(flg==1){
		if(min>sqrt(N)+sqrt(N)-2){
			min=sqrt(N)+sqrt(N)-2;
		}
	}
	
	printf("%lld",min);
	return 0;
}