无法理解使用这张地图背后的证明<>方法
Can't understand the proof behind the use of this map<> method
Drazil正在和Varda玩数学游戏。
让我们将正整数 x 定义为其阶乘的乘积 数字。例如,f(135) = 1!* 3!* 5!= 720。
首先,他们选择一个由 n 位数字组成的十进制数 a 至少包含一个大于 1 的数字。这个数字可能 从前导零开始。然后他们应该找到最大的积极因素 数量 X 满足以下两个条件:
- = f(
x 既不包含数字 0,也不包含数字 1。
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"。这可以对所有数字完成,但素数是不可分解的,因此始终是它们本身可用的最佳替代品。
由于我们使用质因式分解,我们也知道我们拥有唯一(也是最长的)数字串可以替换某个数字。
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用分辨率定理用Z3证明
- std::背后的基本原理assignable_from可能的实现
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 传递背后的原因 通过引用C++中的函数?
- 证明构造函数体内的辅助是低效的
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 嵌套循环背后的逻辑
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- while(sline >> n >> c && c== ',')背后的逻辑是什么?
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- C++模板模板参数背后的基本原理
- C++活动异常机制背后的推理
- 此解决方案背后的直觉
- 尝试读取/写入Graphviz DAG值的工作证明会导致segfault
- opengl中鼠标输入背后的数学和偏航/俯仰值
- 有人能解释一下这些说法背后的逻辑是什么吗
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 无法理解使用这张地图背后的证明<>方法