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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class State
{

    public int nokoriMatch;

    public int[] usable_numbers;
    public int[] 仮定;

    public string maxnumber;

    

    public State()
    {
        usable_numbers = null;
        仮定 = new int[] { 100000, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
        nokoriMatch = 0;
        maxnumber = "";

    }

    public State(int nokori, int[] usable,string max)
    {
        this.nokoriMatch = nokori;
        this.usable_numbers = usable;
        仮定 = new int[] { 100000, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
        this.maxnumber = max;


    }


}

public class ABC
{


    



    public static void Main()
    {
        int[] r = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int n = r[0];
        int m = r[1];
        int[] S = new int[3];
        int[] 仮定 = { 100000, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
        int[] usable = Console.ReadLine().Split().Select(int.Parse).ToArray();
        dp(new State(n, usable, ""), ref S);
    }






    //max桁数　= int[マッチの本数] = その本数で作れる最大の桁数
    public static State dp(State state,ref int[] maxketasuu)
    {//returnするのは「作成した数字の個数」
        if (state.nokoriMatch == 0) return state;
        else if (state.nokoriMatch < 0) return null;
        else
        {
            List<State> states = new List<State>();
            for (int i = 0; i < state.usable_numbers.Length; i++)
            {
                string newnumber = AddString(state.maxnumber, state.usable_numbers[i].ToString());
                State candidate = new State(state.nokoriMatch - state.仮定[state.usable_numbers[i]], state.usable_numbers, newnumber);
                states.Add(candidate);
            }
            State output = new State();
            while (states.Count > 0)
            {
                var temp = states[0];
                states.RemoveAt(0);
                State outputcandidate = dp(temp, ref maxketasuu);
                if (outputcandidate == null) continue;
                if (Compare(outputcandidate.maxnumber, output.maxnumber) == 1)
                    output = outputcandidate;
                

            }
 
            return output;

        }
        return null;
    }
    public static string AddString(string longer, string num)
    {
        for (int i = 0; i < longer.Length; i++)
        {
            if (int.Parse(longer[i].ToString()) < int.Parse(num))
            {
                return longer.Substring(0, i) + num + longer.Substring(i);
            }

        }
        return longer + num;

    }

    public static int Compare(string A, string B)
    {
        if (A.Length < B.Length) return -1;
        if (A.Length > B.Length) return 1;

        for (int i = 0; i < A.Length; i++)
        {
            if (A[i] > B[i]) return 1;
            if (A[i] < B[i]) return -1;

        }
        return 0;
    }



}