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: Wrong Answer)

#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;
int ord[9] = {1,7,4,5,3,2,9,6,8};
int mat[9] = {2,3,4,5,5,5,6,6,7};
int hav[9] = {0,0,0,0,0,0,0,0,0};
int res[9] = {0,0,0,0,0,0,0,0,0};
int dp(int remain,int order){
  //cout << "remain:" << remain << ",order:" << order << ",num=" << ord[order]<< endl;
  int needMatch = mat[order];
  int div = remain/needMatch;
  if(remain%needMatch == 0){
    res[ord[order]] = div;
    return 0;
  }
  int next = order+1;
  if(next >= 9) return -1;
  int nextNum = ord[next]-1;
  while(hav[nextNum]==0){
    next++;
    if(next >= 9) break;
    nextNum = ord[next]-1;
  }
  if(next == 9) return -1;
  for(int i=div;i>=0;i--){
    if(dp(remain - i*needMatch,next)==0){
      res[ord[order]] = i;
      return 0;
    }
  }
  return -1;
}
int main() {
  int n,m;
  cin >> n >> m;
  for(int i=0;i<m;i++){
    int a;
    cin >> a;
    hav[a-1] = 1;
  }
  //for(int i=0;i<9;i++) cout << i+1 << ":" << hav[i] << endl;
  int next = 10;
  for(int i=0;i<9;i++) if(hav[i]==1) {
    int no;
    for(int j=0;j<9;j++) if(ord[j]==i+1) no = j;
    //cout << "i:" << i+1 << ",no:" << no << endl;
    next = min(next,no);
  }
  dp(n,next);
  //for(int i=0;i<9;i++) cout << res[i] << endl;

  for(int i=8;i>=0;i--){
    for(int j=0;j<res[i];j++) cout << i;
  }
  cout << endl;

  //cout <<  << endl;
  return 0;
}