无法理解使用这张地图背后的证明<>方法

Can't understand the proof behind the use of this map<> method

本文关键字:背后 证明 lt 方法 gt 地图 张地图      更新时间:2023-10-16

Drazil正在和Varda玩数学游戏。

让我们将正整数 x 定义为其阶乘的乘积 数字。例如,f(135) = 1!* 3!* 5!= 720。

首先,他们选择一个由 n 位数字组成的十进制数 a 至少包含一个大于 1 的数字。这个数字可能 从前导零开始。然后他们应该找到最大的积极因素 数量 X 满足以下两个条件:

  1. x 既不包含数字 0,也不包含数字 1。

  2. = f(
  3. x) = f(a)

帮助朋友找到这样的号码。

输入 第一行包含一个整数 n(1 ≤ n ≤ 15) — 数字 a 中的数字。

第二行包含 a 的 n 位数字。中至少有一个数字 a 大于 1。数字 a 可能包含前导零。

输出输出满足条件的最大可能整数 以上。这个数字小数中不应有零和一 表示法。

示例
输入
4
1234
输出
33222

输入
3
555 输出
555

这是解决方案,

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int main()
{
map<char, string> mp;
mp['0'] = mp['1'] = "";
mp['2'] = "2";
mp['3'] = "3";
mp['4'] = "223";
mp['5'] = "5";
mp['6'] = "35";
mp['7'] = "7";
mp['8'] = "2227";
mp['9'] = "2337";
int n;
string str;
cin>>n>>str;
string res;
for(int i = 0; i < str.size(); ++i)
res += mp[str[i]];
sort(res.rbegin(), res.rend());
cout<<res;
return 0;
}

我希望有人解释为什么数字被转换为其他形式的数字的原因,而不仅仅是用某种方法来计算数字。可悲的是,蛮力会在这个问题中给出一个 TLE(时间限制超过),因为 15 位数字的事情,所以这是一个很大的数字,所以我恳请有人可以解释下面的"证明",导致 idk 什么理论说这些数字可以转换为这些数字,例如 4 到 223 之类的。 提前谢谢。

图片:证据说了什么

这些转换背后的理论如下(以 4 为例):

4! = 3! * 2! * 2!

较长的数字序列将始终比较短的序列产生更大的数字(至少对于正整数)。因此,此代码在可能的情况下生成更长的序列。通过上面的例子,我们得到:

4! = 3! * 4

我们不能再减少3!,因为3是素数。 另一方面,4 只是 2²:

4 = 2² = 2! * 2!

因此,我们找到了数字序列中 4 的最佳替代品,即 "322"。这可以对所有数字完成,但素数是不可分解的,因此始终是它们本身可用的最佳替代品。

由于我们使用质因式分解,我们也知道我们拥有唯一(也是最长的)数字串可以替换某个数字。