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: Accepted)

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INF -(1<<20)

int max(int len, ...) {
    int i, _max, num;
    va_list ap;
    va_start(ap, len);

    _max = va_arg(ap, int);
    for (i = 1; i < len; i++) {
        num = va_arg(ap, int);
        if (num > _max)
            _max = num;
    }
    va_end(ap);
    return _max;
}

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

int desc(const void *a, const void *b) {
    return *(int *)b - *(int *)a;
}

int main(void) {
    int flag, i, j, K, min, N, M, A[10], AS[10], dp[100010];
    scanf("%d%d", &N, &M);
    for (i=1;i<=M;i++) scanf("%d",&A[i]);

//    memmove(AS,A,sizeof(int)*10);

    dp[0] = 0;
    flag = 0;
    for (i=1;i<=N;i++) {
        dp[i] = INF;
        for (j=1;j<=M;j++) {
            if (i-C[A[j]] >= 0) {
                dp[i] = max( 2, dp[i], dp[i-C[A[j]]] );
                flag = 1;
            }
        }
        if (flag) dp[i] += 1;
    }

    K = N;
    memmove(AS,A,sizeof(int)*10);
    qsort(AS+1,9,sizeof(int),desc);
    while (K>0) {
        for (j=1;j<=M;j++) {
//            printf("%d %d\n", K, K-C[AS[j]]);
            if (K-C[AS[j]] >= 0) { //printf(" %d %d\n", dp[K], dp[K-C[AS[j]]]);
                if (dp[K] == dp[K-C[AS[j]]] + 1) {
                    printf("%d", AS[j]); 
                    K -= C[AS[j]];
                    break;
                }
            }
        }
    }
    printf("\n");
    return 0;
}