先将其中的所有阶乘中的数全部拆成质数相乘,为了使得长度最长,自然是只选择质数的阶乘可达到最长,因此每次都用质数的阶乘即可。
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#define MAX 100005
#define mod 998244353ll
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
int a[10], b[] = { 2,3,5,7 };
void addnum(int x) {
switch (x)
{
case 2:
a[2]++;
break;
case 3:
a[3]++;
break;
case 4:
a[2] += 2;
break;
case 5:
a[5]++;
break;
case 6:
a[2]++, a[3]++;
break;
case 7:
a[7]++;
break;
case 8:
a[2] += 3;
break;
case 9:
a[3] += 2;
break;
default:
break;
}
}
void subnum(int x) {
switch (x)
{
case 2:
a[2]--;
break;
case 3:
a[3]--;
break;
case 4:
a[2] -= 2;
break;
case 5:
a[5]--;
break;
case 6:
a[2]--, a[3]--;
break;
case 7:
a[7]--;
break;
case 8:
a[2] -= 3;
break;
case 9:
a[3] -= 2;
break;
default:
break;
}
}
int main() {
freopen("a.txt", "r", stdin);
freopen("b.txt", "w", stdout);
int n;
string s;
cin >> n;
cin >> s;
for (int i = 0; s[i]; ++i) {
int t = s[i] - '0';
for (int j = 2; j <= t; ++j) {
addnum(j);
}
}
for (int i = 3; i >= 0; --i) {
while (a[b[i]]) {
printf("%d", b[i]);
for (int j = 2; j <= b[i]; ++j) {
subnum(j);
}
}
}
putchar('\n');
return 0;
}