无法理解使用此地图背后的证据<>方法

时间:2017-05-25 11:10:45

标签: c++

  

Drazil正和Varda一起玩数学游戏。

     

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

     

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

     
      
  1. x不包含数字0和数字1。

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

  4.         

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

         

    输入第一行包含一个整数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位数的事情,因此对于暴力来说是一个很大的数字,所以我希望有人可以解释&#34;证明&#34;下面,导致idk什么理论说这些数字可以转换为那些数字,例如4到223和东西。 提前谢谢。

Picture: What the proof says

1 个答案:

答案 0 :(得分:1)

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

4! = 3! * 2! * 2!

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

4! = 3! * 4

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

4 = 2² = 2! * 2!

因此,我们发现数字序列中4的最佳替换为“322”。这可以对所有数字进行,但素数不可分解,因此永远是他们自己可用的最佳替代品。

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