#include <bits/stdc++.h>
using namespace std;
const string alphabetLower = "abcdefghijklmnopqrstuvwxyz";
const string alphabetHigher = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const string digits = "0123456789";
const long double pi = 3.141592653589793, e = 2.718281828459045;
void read() {}
void print() {}
void debug() { cerr << endl; }
long long gcd(long long a, long long b) {
  if (a < 0) a = abs(a);
  if (b < 0) b = abs(b);
  if (a > b) swap(a, b);
  if (a) return gcd(a, b % a);
  return b;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
struct vt {
  long long x, y;
  vt operator-() { return vt(-this->x, -this->y); }
  vt operator+(vt b) { return {this->x + b.x, this->y + b.y}; }
  vt operator-(vt b) { return *this + (-b); }
  vt operator*(long long b) { return vt(this->x * b, this->y * b); }
  long long operator*(vt b) { return this->x * b.x + this->y * b.y; }
  vt operator/(long long b) { return vt(this->x / b, this->y / b); }
  long long operator%(vt b) { return this->x * b.y - b.x * this->y; }
  bool operator==(vt b) { return this->x == b.x && this->y == b.y; }
  bool operator!=(vt b) { return !((*this) == b); }
  bool collinear(vt b) { return (*this) % b == 0; }
  bool opposite(vt b) { return this->collinear(b) && (*this) * b < 0; }
  double length() { return sqrt(this->x * this->x + this->y * this->y); }
  vt() {}
  vt(long long x, long long y) : x(x), y(y) {}
  vt(long long x1, long long y1, long long x2, long long y2)
      : x(x2 - x1), y(y2 - y1) {}
};
long long fact(long long a) {
  if (a == 1)
    return 1;
  else
    return a * fact(a - 1);
}
long long sign(long long a) {
  if (a > 0) return 1;
  if (a == 0) return 0;
  return -1;
}
bool prime(long long a) {
  if (a < 2) return 0;
  if (a == 2) return 1;
  for (long long b = 2; b <= ceil(sqrt(a)); b++)
    if (a % b == 0) return 0;
  return 1;
}
long long hashStr(string& s) {
  long long base = 26;
  long long res = 0;
  for (long long i = 0; i < ((long long)(s).length()); i++)
    res =
        ((res * base) % 36028797018963913 + s[i] - 'a' + 1) % 36028797018963913;
  return (res + 36028797018963913) % 36028797018963913;
}
long long hashStr(long long prevHash, char curChar) {
  return ((prevHash * 26) % 36028797018963913 + curChar - 'a' + 1) %
         36028797018963913;
}
ifstream fin("input.txt");
ofstream fout("output.txt");
template <typename Arg, typename... Args>
void read(Arg& arg, Args&... args) {
  cin >> arg;
  read(args...);
}
template <typename Arg, typename... Args>
void print(Arg arg, Args... args) {
  cout << setprecision(100) << (arg) << " ";
  print(args...);
}
template <typename Arg, typename... Args>
void debug(Arg arg, Args... args) {
  cerr << (arg) << " ";
  debug(args...);
}
void run() {
  long long n;
  cin >> n;
  string a;
  cin >> a;
  string ans = "";
  long long p[] = {7, 5, 3, 2};
  for (char j : a) {
    if (j < '2') continue;
    long long val = fact(j - '0');
    for (long long i : p)
      while (val % fact(i) == 0) {
        ans += (i + '0');
        val /= fact(i);
      }
  }
  sort(ans.begin(), ans.end());
  reverse(ans.begin(), ans.end());
  cout << ans;
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  run();
  return 0;
}

### Prompt

Construct a CPP code solution to the problem outlined:

Drazil is playing a math game with Varda.

Let's define <image> for positive integer x as a product of factorials of its digits. For example, <image>.

First, they choose a decimal number a consisting of n digits that contains at least one digit larger than 1. This number may possibly start with leading zeroes. Then they should find maximum positive number x satisfying following two conditions:

1. x doesn't contain neither digit 0 nor digit 1.

2. <image> = <image>.

Help friends find such number.

Input

The first line contains an integer n (1 ≤ n ≤ 15) — the number of digits in a.

The second line contains n digits of a. There is at least one digit in a that is larger than 1. Number a may possibly contain leading zeroes.

Output

Output a maximum possible integer satisfying the conditions above. There should be no zeroes and ones in this number decimal representation.

Examples

Input

4
1234


Output

33222


Input

3
555


Output

555

Note

In the first case, <image>

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const string alphabetLower = "abcdefghijklmnopqrstuvwxyz";
const string alphabetHigher = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const string digits = "0123456789";
const long double pi = 3.141592653589793, e = 2.718281828459045;
void read() {}
void print() {}
void debug() { cerr << endl; }
long long gcd(long long a, long long b) {
  if (a < 0) a = abs(a);
  if (b < 0) b = abs(b);
  if (a > b) swap(a, b);
  if (a) return gcd(a, b % a);
  return b;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
struct vt {
  long long x, y;
  vt operator-() { return vt(-this->x, -this->y); }
  vt operator+(vt b) { return {this->x + b.x, this->y + b.y}; }
  vt operator-(vt b) { return *this + (-b); }
  vt operator*(long long b) { return vt(this->x * b, this->y * b); }
  long long operator*(vt b) { return this->x * b.x + this->y * b.y; }
  vt operator/(long long b) { return vt(this->x / b, this->y / b); }
  long long operator%(vt b) { return this->x * b.y - b.x * this->y; }
  bool operator==(vt b) { return this->x == b.x && this->y == b.y; }
  bool operator!=(vt b) { return !((*this) == b); }
  bool collinear(vt b) { return (*this) % b == 0; }
  bool opposite(vt b) { return this->collinear(b) && (*this) * b < 0; }
  double length() { return sqrt(this->x * this->x + this->y * this->y); }
  vt() {}
  vt(long long x, long long y) : x(x), y(y) {}
  vt(long long x1, long long y1, long long x2, long long y2)
      : x(x2 - x1), y(y2 - y1) {}
};
long long fact(long long a) {
  if (a == 1)
    return 1;
  else
    return a * fact(a - 1);
}
long long sign(long long a) {
  if (a > 0) return 1;
  if (a == 0) return 0;
  return -1;
}
bool prime(long long a) {
  if (a < 2) return 0;
  if (a == 2) return 1;
  for (long long b = 2; b <= ceil(sqrt(a)); b++)
    if (a % b == 0) return 0;
  return 1;
}
long long hashStr(string& s) {
  long long base = 26;
  long long res = 0;
  for (long long i = 0; i < ((long long)(s).length()); i++)
    res =
        ((res * base) % 36028797018963913 + s[i] - 'a' + 1) % 36028797018963913;
  return (res + 36028797018963913) % 36028797018963913;
}
long long hashStr(long long prevHash, char curChar) {
  return ((prevHash * 26) % 36028797018963913 + curChar - 'a' + 1) %
         36028797018963913;
}
ifstream fin("input.txt");
ofstream fout("output.txt");
template <typename Arg, typename... Args>
void read(Arg& arg, Args&... args) {
  cin >> arg;
  read(args...);
}
template <typename Arg, typename... Args>
void print(Arg arg, Args... args) {
  cout << setprecision(100) << (arg) << " ";
  print(args...);
}
template <typename Arg, typename... Args>
void debug(Arg arg, Args... args) {
  cerr << (arg) << " ";
  debug(args...);
}
void run() {
  long long n;
  cin >> n;
  string a;
  cin >> a;
  string ans = "";
  long long p[] = {7, 5, 3, 2};
  for (char j : a) {
    if (j < '2') continue;
    long long val = fact(j - '0');
    for (long long i : p)
      while (val % fact(i) == 0) {
        ans += (i + '0');
        val /= fact(i);
      }
  }
  sort(ans.begin(), ans.end());
  reverse(ans.begin(), ans.end());
  cout << ans;
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  run();
  return 0;
}

```