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# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;

public class AtCoder
{
    int n, m;
    int[] a;
    bool[] b;
    int[] x;
    int[] ans;
    int[] need;
    int c;
    bool exit;

    public static void Main()
    {
        AtCoder chokudai = new AtCoder();
        chokudai.delendus();
    }

    public void delendus()
    {
        string[] s;
        s = NextS();

        n = int.Parse(s[0]);
        m = int.Parse(s[1]);

        s = NextS();
        a = new int[n];
        b = new bool[10];
        for (int i = 0; i < m; i++)
        {
            a[i] = int.Parse(s[i]);
            b[a[i]] = true;
        }
        x = new int[6];
        if (b[1]) x[0] = -1;
        if (b[7]) x[1] = -7;
        if (b[4]) x[2] = -4;
        if (b[5]) x[3] = -5;
        else if (b[3]) x[3] = -3;
        else if (b[2]) x[3] = -2;
        if (b[9]) x[4] = -9;
        else if (b[6]) x[4] = -6;
        if (b[8]) x[5] = -8;

        ans = new int[6000];
        c = 0;
        exit = false;
        need = new int[] { 0, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
        int[] y = new int[] { 0, 0, 0, 0, 0, 0 };
        recur(0, n, y);
        Array.Sort(ans);
        for (int i = 0; i < 6000; i++)
        {
            if (ans[i] != 0) Console.Write(-ans[i]);
        }
        Console.WriteLine();
        Console.ReadLine();
    }


    public void recur(int t, int r, int[] s)
    {
        if (exit) return;
        int[] y = new int[6];
        for (int i = 0; i < 6; i++)
        {
            y[i] = s[i];
        }
        if (r == 0)
        {
            for (int i = 0; i < 6; i++)
            {
                while (y[i] > 0)
                {
                    ans[c] = x[i];
                    c++; y[i]--;
                }
            }
            exit = true;
            return;
        }
        if (t > 5) return;
        if (x[t] == 0)
        {
            recur(t + 1, r, y);
            return;
        }

        y[t] = r / need[-x[t]];
        r -= y[t] * need[-x[t]];
        recur(t + 1, r, y);

        while (y[t] > 0)
        {
            if (exit) return;
            y[t]--;
            r += need[-x[t]];
            recur(t + 1, r, y);
        }
    }

    public static void DebugWL(object x) { System.Diagnostics.Debug.WriteLine(x); }
    public static string[] NextS() { return Console.ReadLine().Trim().Split(' '); }
}