#[allow(unused_imports)]
use std::cmp::*;
#[allow(unused_imports)]
use std::collections::*;

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

#[derive(Clone)]
struct BigInt {
    int: Vec<usize>,
    made: bool,
}

impl BigInt {
    fn add_new_digit_to_msb(&mut self, num: usize) {
        self.int.push(num);
    }

    fn to_string(self) -> String {
        let mut digits = self.int.clone();
        digits.reverse();
        digits
            .iter()
            .map(|&x| x.to_string())
            .collect::<Vec<_>>()
            .join("")
    }
}

impl Ord for BigInt {
    fn cmp(&self, other: &BigInt) -> Ordering {
        if self.int.len() > other.int.len() {
            return Ordering::Greater;
        } else if self.int.len() < other.int.len() {
            return Ordering::Less;
        }
        for i in (0..self.int.len()).rev() {
            if self.int[i] > other.int[i] {
                return Ordering::Greater;
            } else if self.int[i] < other.int[i] {
                return Ordering::Less;
            }
        }
        Ordering::Equal
    }
}

impl PartialOrd for BigInt {
    fn partial_cmp(&self, other: &BigInt) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

impl PartialEq for BigInt {
    fn eq(&self, other: &BigInt) -> bool {
        self.int == other.int
    }
}
impl Eq for BigInt {}

fn main() {
    let v: Vec<usize> = read_vec();
    let n = v[0];
    let mut a = read_vec::<usize>();
    a.sort();

    let mut convert_dict = HashMap::new();

    for num in a {
        if num == 1 {
            convert_dict.insert(2usize, 1);
        } else if num == 2 {
            convert_dict.insert(5, 2);
        } else if num == 3 {
            *convert_dict.entry(5).or_insert(3) = 3;
        } else if num == 4 {
            convert_dict.insert(4, 4);
        } else if num == 5 {
            *convert_dict.entry(5).or_insert(5) = 5;
        } else if num == 6 {
            *convert_dict.entry(6).or_insert(6) = 6;
        } else if num == 7 {
            *convert_dict.entry(3).or_insert(7) = 7;
        } else if num == 8 {
            *convert_dict.entry(7).or_insert(8) = 8;
        } else if num == 9 {
            *convert_dict.entry(6).or_insert(9) = 9;
        }
    }

    let mut dp = vec![
        BigInt {
            int: vec![],
            made: false,
        };
        n + 1
    ];
    dp[0] = BigInt {
        int: vec![],
        made: true,
    };

    for i in 2..n + 1 {
        for &cost in convert_dict.keys() {
            if i >= cost && dp[i - cost].made {
                let mut new_int = dp[i - cost].clone();
                new_int.add_new_digit_to_msb(convert_dict[&cost]);
                // println!("try {0} {1}", i, new_int.clone().to_string());
                dp[i] = max(new_int, dp[i].clone());
                dp[i].made = true;
                // println!("{0} {1}", i, dp[i].clone().to_string());
            }
        }
    }
    println!("{}", dp[n].clone().to_string());
}


Measured memory_bytes: 358652