Problem:
Score : 400 points

Problem Statement

You start with the number 0 and you want to reach the number N.

You can change the number, paying a certain amount of coins, with the following operations:

Multiply the number by 2, paying A coins.

Multiply the number by 3, paying B coins.

Multiply the number by 5, paying C coins.

Increase or decrease the number by 1, paying D coins.

You can perform these operations in arbitrary order and an arbitrary number of times.

What is the minimum number of coins you need to reach N?

You have to solve T testcases.

Constraints

1 \le T \le 10

1 \le N \le 10^{18}

1 \le A, B, C, D \le 10^9

All numbers N, A, B, C, D are integers.

Input

The input is given from Standard Input. The first line of the input is

T

Then, T lines follow describing the T testcases.
Each of the T lines has the format

N A B C D

Output

For each testcase, print the answer on Standard Output followed by a newline.

Sample Input 1

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

Sample Output 1

20
19
26
3821859835
23441258666

For the first testcase, a sequence of moves that achieves the minimum cost of 20 is:

Initially x = 0.

Pay 8 to increase by 1 (x = 1).

Pay 1 to multiply by 2 (x = 2).

Pay 1 to multiply by 2 (x = 4).

Pay 2 to multiply by 3 (x = 12).

Pay 8 to decrease by 1 (x = 11).

For the second testcase, a sequence of moves that achieves the minimum cost of 19 is:

Initially x = 0.

Pay 8 to increase by 1 (x = 1).

Pay 1 to multiply by 2 (x = 2).

Pay 2 to multiply by 5 (x = 10).

Pay 8 to increase by 1 (x = 11).

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define FOR(i,x,y) for (register int i=(x);i<(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define Debug(v) for (auto i:v) printf("%lld ",i);puts("")
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define ep emplace_back
#define siz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define fil(a,b) memset((a),(b),sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
typedef pair<ll,ll> PA;
typedef vector<int> poly;
inline ll read(){
    ll x=0,f=1;char c=getchar();
    while ((c<'0'||c>'9')&&(c!='-')) c=getchar();
    if (c=='-') f=-1,c=getchar();
    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}

ll n,A,B,C,D;

const int N = 1e5;
ll f[N+10];
bool vis[N+10];
priority_queue<PA>q;
inline void init(){
	For(i,0,N) vis[i]=0,f[i]=1e18;
	f[0]=0,q.push(mp(0,0));
	while (!q.empty()){
		int u=q.top().se;q.pop();
		if (vis[u]) continue;vis[u]=1;
		if (u&&f[u]+D<f[u-1]) f[u-1]=f[u]+D,q.push(mp(-f[u-1],u-1));
		if (u+1<=N&&f[u]+D<f[u+1]) f[u+1]=f[u]+D,q.push(mp(-f[u+1],u+1));
		if (u*2<=N&&f[u]+A<f[u*2]) f[u*2]=f[u]+A,q.push(mp(-f[u*2],u*2));
		if (u*3<=N&&f[u]+B<f[u*3]) f[u*3]=f[u]+B,q.push(mp(-f[u*3],u*3));
		if (u*5<=N&&f[u]+C<f[u*5]) f[u*5]=f[u]+C,q.push(mp(-f[u*5],u*5));
	}
}
map<ll,ll>g;
inline ll Query(ll n){
	if (n<=N) return f[n];
	if (g.count(n)) return g[n];
	__int128 ret=Query(n/2)+min((__int128)n%2*D+A,(__int128)(n-n/2)*D); 
	ret=min(ret,Query(n/3)+min((__int128)n%3*D+B,(__int128)(n-n/3)*D));
	if (n%3==2) ret=min(ret,Query(n/3+1)+min((__int128)D+B,(__int128)(n-n/3-1)*D));
	ret=min(ret,Query(n/5)+min((__int128)n%5*D+C,(__int128)(n-n/5)*D));
	if (n%5>5-n%5) ret=min(ret,Query(n/5+1)+min((__int128)(5-n%5)*D+C,(__int128)(n-n/5-1)*D));
	return g[n]=ret;
}
inline void solve(){
	n=read(),A=read(),B=read(),C=read(),D=read();
	init(),g.clear(),printf("%lld\n",Query(n));
}

int main(){
	int T=read();
	while (T--) solve();
}