Problem:
Score : 400 points

Problem Statement

Find the largest integer that can be formed with exactly N matchsticks, under the following conditions:

Every digit in the integer must be one of the digits A_1, A_2, ..., A_M (1 \leq A_i \leq 9).

The number of matchsticks used to form digits 1, 2, 3, 4, 5, 6, 7, 8, 9 should be 2, 5, 5, 4, 5, 6, 3, 7, 6, respectively.

Constraints

All values in input are integers.

2 \leq N \leq 10^4

1 \leq M \leq 9

1 \leq A_i \leq 9

A_i are all different.

There exists an integer that can be formed by exactly N matchsticks under the conditions.

Input

Input is given from Standard Input in the following format:

N M
A_1 A_2 ... A_M

Output

Print the largest integer that can be formed with exactly N matchsticks under the conditions in the problem statement.

Sample Input 1

20 4
3 7 8 4

Sample Output 1

777773

The integer 777773 can be formed with 3 + 3 + 3 + 3 + 3 + 5 = 20 matchsticks, and this is the largest integer that can be formed by 20 matchsticks under the conditions.

Sample Input 2

101 9
9 8 7 6 5 4 3 2 1

Sample Output 2

71111111111111111111111111111111111111111111111111

The output may not fit into a 64-bit integer type.

Sample Input 3

15 3
5 4 6

Sample Output 3

654

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define rep(i,n) for(int i=0;i<n;i++)
#define INF LLONG_MAX
#define eps LDBL_EPSILON
#define moder 100000
#define pie 3.141592653589793238462643383279
#define P std::pair<int,int>
#define prique priority_queue
using namespace std;
int n,m;
int a[]={INF,2,5,5,4,5,6,3,7,6};
int b[9],c[9];
bool func(int x,int y){
	if(a[x]<a[y])return true;
	if(a[x]==a[y])return x<y;
	return false;
}
set<int> st;
signed main() {
	cin>>n>>m;
	rep(i,m){
		cin>>b[i];
		c[i]=b[i];
		st.insert(b[i]);
	}
	sort(b,b+m,func);
	int memo=n/a[b[0]];
	bool flag=n%a[b[0]]==0;
	string ans;
	for(int i=1;i<m;i++){
		if(!flag&&a[b[i]]!=a[b[0]]){
			if(b[i]>b[0]&&(n-memo*a[b[0]])%(a[b[i]]-a[b[0]])==0){
				ans="";
				rep(j,(n-memo*a[b[0]])/(a[b[i]]-a[b[0]]))ans+='0'+b[i];
				rep(j,memo-(n-memo*a[b[0]])/(a[b[i]]-a[b[0]]))ans+='0'+b[0];
			}
			else if(b[i]<b[0]&&(n-memo*a[b[0]])%(a[b[i]]-a[b[0]])==0){
				ans="";
				rep(j,memo-(n-memo*a[b[0]])/(a[b[i]]-a[b[0]]))ans+='0'+b[0];
				rep(j,(n-memo*a[b[0]])/(a[b[i]]-a[b[0]]))ans+='0'+b[i];
			}
		}
	}
	string ans2;
	for(int i=1;i<=100000000;i++){
		string s=to_string(i);
		int x=s.size();
		rep(j,x)if(st.find(s[j])==st.end())goto kaage;
		if(ans.size()<x)ans=s;
		else if(ans.size()==x&&ans<s)ans=s;
		kaage:;
	}
	cout<<ans<<endl;
	return 0;
}