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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h> // uint64_t

#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) > (b) ? (b) : (a))

int get_int2(int *a1, int *a2) {
  scanf("%d %d", a1, a2);
  return 0;
}

// <arr[0]> <arr[1]> .. <arr[size-1]>
int fget_array(int *arr, int size) {
    int i;
    for(i = 0; i < size; i++) {
        scanf("%d", &arr[i]);
    }
    return 0;
}

int cnts[10] = {
    0,
    2,5,5,
    4,5,6,
    3,7,6
};

#define NUM_MAX 10000
#define MATCHES_MAX 7
#define DP_MAX 30

int asc(const void *a1, const void *a2) { return *(int*)a1 - *(int*)a2; }

int main(void) {
    int num, kinds;
    get_int2(&num, &kinds);
    int arr[10];
    fget_array(arr, kinds);
    qsort(arr, kinds, sizeof(int), asc);
    int i, j;
    int consume = 10;
    int cdigit;
    for(i = kinds-1; i >= 0; i--) {
        int digit = arr[i];
        if(consume > cnts[digit]) {
            consume = cnts[digit];
            cdigit = digit;
        }
    }

    static int64_t dp[DP_MAX+1];
    for(i = 0; i <=DP_MAX; i++) dp[i] = -1;
    dp[0] = 0;
    for(i = kinds-1; i >= 0; i--) {
        int digit = arr[i];
        int cnt = cnts[digit];
        for(j = 0; j <= DP_MAX; j++) {
            if(j >= cnt) dp[j] = max(dp[j], dp[j-cnt]*10 + digit);
        }
    }
#ifdef DEBUG
    for(i = 0; i <= DP_MAX; i++) printf("%d -> %lld\n", i, dp[i]);
#endif
    

    // # of counts of digits
    static int cnt_map[10];
    int base_digit = cdigit;
    while(num > DP_MAX) {
        num -= consume;
        cnt_map[base_digit]++;
    }
    int64_t rem = dp[num];
    while(rem) {
        cnt_map[rem%10]++;
        rem /= 10;
    }

    for(i = 9; i >= 1; i--) {
        while(cnt_map[i]) {
            putchar('0' + i);
            cnt_map[i]--;
        }
    }
    putchar('\n');
    return 0;
}