【问题标题】:Can't understand the proof behind the use of this map<> method无法理解使用此 map<> 方法背后的证明
【发布时间】:2017-05-25 11:10:45
【问题描述】:

Drazil 正在和 Varda 玩数学游戏。

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

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

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

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

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

Input 第一行包含一个整数 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位数字的原因,所以这是一个很大的数字,所以我希望有人可以解释下面的“证明”,因为我知道什么理论说这些数字可以转换为这些数字,例如4到223和东西。 提前致谢。

Picture: What the proof says

【问题讨论】:

  • 我认为解释中缺少一些内容。 “让我们将正整数 x 定义为其数字的阶乘的乘积。例如,。”,无法真正理解这句话,好像示例丢失了。后来,"2.=f(x)=f(a)"f是什么?在第一个等号之前似乎还缺少一些东西。
  • 抱歉我编辑了它@jdehesa 似乎引用消除了这部分文本

标签: c++


【解决方案1】:

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

4! = 3! * 2! * 2!

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

4! = 3! * 4

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

4 = 2² = 2! * 2!

因此,我们找到了数字序列中 4 的最佳替换为“322”。这可以对所有数字进行,但素数不可因式分解,因此将始终是它们自己可用的最佳替代品。

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

【讨论】:

  • 这部分我好像看不懂:4! = 3! * 2! * 2!我们从哪里得出这个结论:4!是3! * 2! * 2!例如6!是5! * 3!
  • 4! = 4 * 3 * 2 = 2 * 2 * 3 * 2 = 2! * 2! * 3!(顺序无关紧要,反正我们会在之后排序)这是一个简单的数学事实。由于f(x) 的定义,我们可以在不改变f(x) 的结果的情况下对每个数字执行此操作。这些都是预先计算好的。
  • 我有点理解,所以@jdehesa 6! = 6 * 5 * 4 * 3 * 2 这意味着 6! = 3 * 2 * 5 * 4 * 3 * 2 这意味着 6! = 3! * 5!转换为 35。
  • @Kalcor 我同意 6! = 3 * 2 * 5 * 4 * 3 * 2,但不应该是 6! = 2! * 3! * 5!,这又会转化为 235 而不仅仅是 35?或者我只是错过了一些东西。
  • @jdehesa 你可以用计算器轻松测试,但无论如何你必须考虑2! * 3! * 5! = 2 * 3 * 2 * 5 * 4 * 3 * 2,另一方面6! = 6 * 5 * 4 * 3 * 2 = 3 * 2 * 5 * 4 * 3 * 22! 会在计算中引入另一个 2,导致结果不正确。
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多