unittest
{
	assert( [ "5", "11 1 2 4 8", "11 1 2 2 8", "32 10 8 5 4", "29384293847243 454353412 332423423 934923490 1", "900000000000000000 332423423 454353412 934923490 987654321" ].parse.expand.solve == "20\n19\n26\n3821859835\n23441258666" );
}



import std.algorithm;
import std.conv;
import std.functional;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto t = input.front.to!( long );
	auto nabcds = new long[ 5 ][ t ];
	foreach( ref nabcd; nabcds )
	{
		input.popFront;
		nabcd = input.front.split.to!( long[] );
	}
	return tuple( nabcds );
}

auto solve( long[ 5 ][] nabcds )
{
	auto anss = new long[ nabcds.length ];
	foreach( ref ans, nabcd; lockstep( anss, nabcds ) )
	{
		ans = memoize!solve2( nabcd[ 0 ], nabcd[ 1 .. $ - 1 ], nabcd[ $ - 1 ] );
	}
	return anss.to!( string[] ).join( "\n" );
}

long solve2( ulong n, long[] abc, long d )
{
	auto m = n * d;
	
	// 1を引く しかできない
	if( n <= 1 ) return m;
	
	// 1を引く or 1を足す or 2,3,5で割る 操作の組み合わせでnを0にするときのコストを計算
	foreach( x, M; lockstep( abc, [ 2L, 3L, 5L ] ) )
	{
		if( n % M == 0 )
		{
			// Mで割る
			m = min( m, memoize!solve2( n / M, abc, d ) + x );
		}
		else
		{
			// 1を引くの繰り返しでMの倍数にした後にMで割る
			auto nf = n / M * M;
			m = min( m, memoize!solve2( nf / M, abc, d ) + x + d * ( n - nf ) );
			
			// 1を足すの繰り返しでMの倍数にした後にMで割る
			auto nc = ( n + M - 1 ) / M * M;
			m = min( m, memoize!solve2( nc / M, abc, d ) + x + d * ( nc - n ) );
		}
	}
	return m;
}
