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;

namespace D
{
    public class Program

    {
        static public int[] num = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        static public int[] quantity = new int[] { 2, 5, 5, 4, 5, 6, 3, 7, 6 };

        public class Match
        {
            public int Num { get; set; }
            public int QUE { get; set; }
            public int CNT { get; set; }
            public Match(int n, int q) { Num = n; QUE = q; }
        }

        static public Match[] matches;

        public static void Main(string[] args)
        {
            int[] nm = RIntAr();
            int[] items = RIntAr();

            matches = new Match[nm[1]];
            for (int i = 0 ; i < items.Count() ; i++)
            {
                matches[i] = new Match(num[items[i] - 1], quantity[items[i] - 1]);
            }

            matches = matches.OrderBy(x => x.QUE).ThenByDescending(x => x.Num).ToArray();
            List<Match> newM = new List<Match>();
            foreach (var item in matches)
            {
                if (!newM.Any(x => x.QUE == item.QUE)) newM.Add(item);
            }
            matches = newM.ToArray();
             
            SetMatch(nm[0]);

            string res = "";
            foreach (var item in matches.OrderByDescending(x => x.Num))
            {
                res += new string(item.Num.ToString()[0], item.CNT);
            }
            Console.WriteLine(res);
        }

        private static bool SetMatch(int num)
        {
            if (num == 0) return true;
            for (int i = 0 ; i < matches.Count() ; i++)
            {
                if (num - matches[i].QUE >= 0)
                {
                    matches[i].CNT++;
                    if(SetMatch(num - matches[i].QUE)) return true;
                    matches[i].CNT--;
                }          
            }
            return false;
        }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}