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 Rust (1.42.0) (judge verdict: Accepted)

fn main() {
	let mut s = String::new();
	use std::io::Read;
	std::io::stdin().read_to_string(&mut s).unwrap();
	let mut s = s.split_whitespace();
	let n: usize = s.next().unwrap().parse().unwrap();
	let m: usize = s.next().unwrap().parse().unwrap();
	const C: [usize; 9] = [2, 5, 5, 4, 5, 6, 3, 7, 6];
	let mut a: Vec<usize> = s.take(m).map(|a| a.parse().unwrap()).collect();
	a.sort();
	let a: Vec<_> = a
		.into_iter()
		.map(|a| (std::char::from_digit(a as u32, 10).unwrap(), C[a - 1]))
		.collect();
	let mut dp = vec![std::i32::MIN; n + 1];
	dp[0] = 0;
	for i in 1..=n {
		for &(_, c) in a.iter() {
			dp[i] = std::cmp::max(
				dp[i],
				i.checked_sub(c)
					.and_then(|i| Some(dp[i]))
					.unwrap_or(std::i32::MIN)
					.saturating_add(1),
			);
		}
	}
	let mut ans = String::new();
	let mut left = n;

	while left > 0 {
		for &(digit, cnt) in a.iter().rev().filter(|&a| left >= a.1) {
			if dp[left - cnt] == dp[left] - 1 {
				ans.push(digit);
				left -= cnt;
				break;
			}
		}
	}

	println!("{}", ans);
}