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 static System.Console;
using static System.Convert;
using static System.Math;

class Program
{
    struct P
    {
        public int num;
        public int m;
        public P(int num,int m)
        {
            this.num = num;
            this.m = m;
        }
    }
    public static int[] mat = new[] { 2, 5, 5, 4, 5, 6, 3, 7, 6 };
    static void Main(string[] args)
    {
        var nm = Array.ConvertAll(ReadLine().Split(' '), int.Parse);
        var ar = Array.ConvertAll(ReadLine().Split(' '), int.Parse);
        
        var res = "";
        var ps = new P[9];
        for (var i = 0; i < 9; i++)
            ps[i] = new P(i, mat[i]);
        ps = ps.Where(p => ar.Contains(p.num+1)).ToArray();
        var sums = new Dictionary<int, List<long>>();
        for(var i = 1; i < Pow(2, ps.Length); i++)
        {
            var sum = 0;
            var a = new List<int>();
            for(var j = 0; j < ps.Length; j++)
            {
                if (((i >> j) & 1) == 1)
                {
                    sum += ps[j].m;
                    a.Add(ps[j].num+1);
                }
            }
            if (sums.ContainsKey(sum))
                sums[sum].Add(ToInt64(string.Join("", a.OrderByDescending(v => v).ToArray())));
            else
                sums[sum] = new List<long>() { ToInt64(string.Join("", a.OrderByDescending(v => v).ToArray())) };
}
        var min = ps.OrderBy(p => p.m).ThenByDescending(p => p.num).First();
        var mod = nm[0] % min.m;
        
        while (mod != 0)
        {
            var a = nm[0] - mod;
            foreach (var item in sums.Keys)
            {
                if (mod < item) continue;
                if (mod%item==0)
                {
                    var ma = sums[item].Max();
                    var o = mod / item;
                    var z = a/ min.m;
                    for (var i = 0; i < z; i++)
                        res += (min.num+1).ToString();
                    var str = "";
                    for (var i = 0; i < o; i++)
                        str += ma.ToString();
                    if (ToInt32(ma.ToString().Substring(0, 1)) < min.num)
                        res += str;
                    else
                        res = str + res;
                    WriteLine(res);
                    return;
                }
            }
            mod += min.m;
        }
        for (var i = 0; i < nm[0] / min.m; i++)
            res += min.num.ToString();
        WriteLine(res);
    }
    private const string ALFA = "abcdefghijklmnopqrstuvwxyz";
    private const int MOD = 1000000007;
}