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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_ON			1										// 汎用フラグ - ON
#define D_OFF			0										// 汎用フラグ - OFF
#define D_VAL_MAX		10										// 最大値情報数
#define D_MATCH_MAX		10000									// 最大マッチ数
#define D_DCNT1_MAX		6										// 最大前半桁数

// 内部構造体 - 値情報
typedef struct Val {
	int miVal;													// 値
	int miUCnt;													// 使用マッチ数
	int miMake;													// 作成可否
} Val;

// 内部変数
static FILE *szpFpI;											// 入力
static int siMCnt;												// マッチ数
static Val sz1Val[D_VAL_MAX];									// 値情報
static int siVCnt;												// 値情報数
static int siDCnt1;												// 桁数 - 前半
static int siDCnt2;												// 桁数 - 後半
static int siMax1;												// 最大値 - 前半
static char sc1Out[D_MATCH_MAX];								// 出力データ

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
#endif

// ソート関数 - 作成可否降順 - 使用マッチ数昇順 - 値降順
int
fSortFnc(
	const void *pzpVal1			// <I> 値１
	, const void *pzpVal2		// <I> 値２
)
{
	Val *lzpVal1 = (Val *)pzpVal1;
	Val *lzpVal2 = (Val *)pzpVal2;

	// 作成可否降順
	if (lzpVal1->miMake > lzpVal2->miMake) {
		return -1;
	}
	else if (lzpVal1->miMake < lzpVal2->miMake) {
		return 1;
	}

	// 使用マッチ数昇順
	if (lzpVal1->miUCnt > lzpVal2->miUCnt) {
		return 1;
	}
	else if (lzpVal1->miUCnt < lzpVal2->miUCnt) {
		return -1;
	}

	// 値降順
	if (lzpVal1->miVal > lzpVal2->miVal) {
		return -1;
	}
	else if (lzpVal1->miVal < lzpVal2->miVal) {
		return 1;
	}

	return 0;
}

// 最大値 - 前半 - セット
int
fSetMax1(
	int piDNo					// <I> 桁
	, int piRCnt				// <I> 残数
	, int piSum					// <I> 合計値
)
{
	int i;

	// 選択終了
	if (piDNo >= siDCnt1) {

		// マッチ残数
		if (piRCnt == 0) {

			// 最大値 - 前半 - 更新
			if (siMax1 < piSum) {
				siMax1 = piSum;
			}
		}

		return 0;
	}

	// 選択
	for (i = 0; i < siVCnt; i++) {

		// マッチ残数
		if (sz1Val[i].miUCnt > piRCnt) {
			continue;
		}

		// 下位へ
		fSetMax1(piDNo + 1, piRCnt - sz1Val[i].miUCnt, piSum * 10 + sz1Val[i].miVal);
	}

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024];

	// データ - 初期化
	memset(sz1Val, 0, sizeof(sz1Val));							// 値情報
	siMax1 = 0;													// 最大値 - 前半

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 値 - セット
	for (i = 1; i < D_VAL_MAX; i++) {
		sz1Val[i].miVal = i;
	}

	// 使用マッチ数 - セット
	sz1Val[1].miUCnt = 2;
	sz1Val[2].miUCnt = 5;
	sz1Val[3].miUCnt = 5;
	sz1Val[4].miUCnt = 4;
	sz1Val[5].miUCnt = 5;
	sz1Val[6].miUCnt = 6;
	sz1Val[7].miUCnt = 3;
	sz1Val[8].miUCnt = 7;
	sz1Val[9].miUCnt = 6;

	// マッチ数・値情報数 - 取得
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d%d", &siMCnt, &siVCnt);

	// 値情報 - 取得
	for (i = 0; i < siVCnt; i++) {
		int liVal;
		fscanf(szpFpI, "%d", &liVal);

		// 作成可
		sz1Val[liVal].miMake = D_ON;
	}
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);

	// 値情報 - ソート
	qsort(sz1Val, D_VAL_MAX, sizeof(Val), fSortFnc);

	// 最大桁数
	int liDCnt = siMCnt / sz1Val[0].miUCnt;

	// 最大値 - セット
	for (i = liDCnt; i >= 1; i--) {

		// 桁数 - 前半
		if (i > D_DCNT1_MAX) {
			siDCnt1 = D_DCNT1_MAX;
		}
		else {
			siDCnt1 = i;
		}

		// 桁数 - 後半
		siDCnt2 = i - siDCnt1;

		// マッチ残数
		int liRCnt = siMCnt - sz1Val[0].miUCnt * siDCnt2;

		// 最大値 - 前半 - セット
		fSetMax1(0, liRCnt, 0);
		if (siMax1 > 0) {					// セットOK
			break;
		}
	}

	// 結果 - セット - 前半
	sprintf(sc1Out, "%d", siMax1);
	int liLen = strlen(sc1Out);

	// 結果 - セット - 後半
	for (i = 0; i < siDCnt2; i++) {
		sc1Out[liLen + i] = sz1Val[0].miVal + '0';
	}

	// 結果 - セット - 改行・終端文字
	sc1Out[liLen + siDCnt2] = '\n';
	sc1Out[liLen + siDCnt2 + 1] = '\0';

	// 結果 - 表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, sc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", sc1Out);
#endif

	// 残データ有無
#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, "")) {
		siRes = -1;
	}
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpI);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}