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

using System;
using System.Linq;
using System.Collections.Generic;

namespace Contest
{
    class Program
    {
        static void Main(string[] args)
        {
            ABC118.D();
        }

        class ABC118
        {
            public static void A()
            {
                var A = Read.Int();
                var B = Read.Int();
                Console.WriteLine(B % A == 0 ? A + B : B - A);
            }
            public static void B()
            {
                var N = Read.Int();
                var M = Read.Int();
                var KA = Enumerable.Range(0, N).Select(i => Read.IntN()).ToArray();
                int[] count = new int[M + 1];
                foreach(var ka in KA)
                {
                    foreach(var v in ka.Skip(1))
                    {
                        count[v]++;
                    }
                }
                Console.WriteLine(count.Count(x => x == N));
            }
            public static void C()
            {
                var N = Read.Int();
                var A = Read.LongN();
                long gcd = A[0];
                for(int i = 1; i < N; ++i)
                {
                    gcd = Util.GCD(gcd, A[i]);
                }
                Console.WriteLine(gcd);
            }
            public static void D()
            {
                var N = Read.Int();
                var M = Read.Int();
                var A = Read.IntN();

                var table = new int[] { 0, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
                Dictionary<int, int> map = new Dictionary<int, int>();
                foreach(var a in A)
                {
                    var b = table[a];
                    if (map.ContainsKey(b))
                    {
                        map[b] = Math.Max(map[b], a);
                    }
                    else
                    {
                        map.Add(b, a);
                    }
                }
                var dp = Enumerable.Range(0, N + 1).Select(i => -1).ToArray();
                dp[0] = 0;
                for(int i = 2; i <= N; ++i)
                {
                    foreach(var k in map.Keys)
                    {
                        if (i >= k)
                        {
                            dp[i] = Math.Max(dp[i], dp[i - k] + 1);
                        }
                    }
                }
                List<int> keta = new List<int>();
                int idx = N;
                var cand = map.OrderBy(x => -x.Value).ToArray();
                while (idx > 0)
                {
                    foreach(var kvp in cand)
                    {
                        if (idx >= kvp.Key && dp[idx] == dp[idx - kvp.Key] + 1)
                        {
                            keta.Add(kvp.Value);
                            idx -= kvp.Key;
                            break;
                        }
                    }
                }
                Console.WriteLine(String.Join("", keta));
            }
        }

        class Util
        {
            public static long GCD(long a, long b)
            {
                while (b > 0)
                {
                    var c = a % b;
                    a = b;
                    b = c;
                }
                return a;
            }
        }

        static class Read
        {
            static Queue<string> queue = new Queue<string>();
            static void Enqueue() { var ss = Console.ReadLine().Split(' '); foreach (var s in ss) { queue.Enqueue(s); } }
            public static int Int() { if (queue.Count == 0) { Enqueue(); } return Convert.ToInt32(queue.Dequeue()); }
            public static long Long() { if (queue.Count == 0) { Enqueue(); } return Convert.ToInt64(queue.Dequeue()); }
            public static string Str() { if (queue.Count == 0) { Enqueue(); } return queue.Dequeue(); }
            public static int[] IntN() { return Console.ReadLine().Split(' ').Select(s => Convert.ToInt32(s)).ToArray(); }
            public static long[] LongN() { return Console.ReadLine().Split(' ').Select(s => Convert.ToInt64(s)).ToArray(); }
            public static string[] StrN() { return Console.ReadLine().Split(' '); }
            public static Tuple<int, int>[] TupleInt(int n) { List<Tuple<int, int>> list = new List<Tuple<int, int>>(); for (int i = 0; i < n; ++i) { var ab = Read.IntN(); list.Add(new Tuple<int, int>(ab[0], ab[1])); } return list.ToArray(); }
            public static Tuple<long, long>[] TupleLong(int n) { List<Tuple<long, long>> list = new List<Tuple<long, long>>(); for (int i = 0; i < n; ++i) { var ab = Read.LongN(); list.Add(new Tuple<long, long>(ab[0], ab[1])); } return list.ToArray(); }
            public static Tuple<string, string>[] TupleStr(int n) { List<Tuple<string, string>> list = new List<Tuple<string, string>>(); for (int i = 0; i < n; ++i) { var ab = Read.StrN(); list.Add(new Tuple<string, string>(ab[0], ab[1])); } return list.ToArray(); }
            public static Tuple<double, double>[] TupleDouble(int n) { List<Tuple<double, double>> list = new List<Tuple<double, double>>(); for (int i = 0; i < n; ++i) { var ab = Read.LongN(); list.Add(new Tuple<double, double>(ab[0], ab[1])); } return list.ToArray(); }
            public static long[,] LongMatrix(int r, int c)
            {
                var mat = new long[r, c];
                for (int i = 0; i < r; ++i)
                {
                    var x = Read.LongN();
                    for (int j = 0; j < c; ++j)
                    {
                        mat[i, j] = x[j];
                    }
                }
                return mat;
            }
            public static Dictionary<int, HashSet<int>> AdjacencyList(int N, int M)
            {
                Dictionary<int, HashSet<int>> dict = new Dictionary<int, HashSet<int>>();
                for (int i = 0; i <= N; ++i)
                {
                    dict.Add(i, new HashSet<int>());
                }
                for (int i = 0; i < M; ++i)
                {
                    var ab = Read.IntN();
                    dict[ab[0]].Add(ab[1]);
                    dict[ab[1]].Add(ab[0]);
                }
                return dict;
            }
        }
    }
}