【问题标题】:The exact number of divisor (n) of a number is given, how to determine the smallest number which has n divisors?给定一个数的确切除数(n),如何确定有n个除数的最小数?
【发布时间】:2019-10-24 05:06:16
【问题描述】:

问题描述: 链接:https://www.urionlinejudge.com.br/judge/en/problems/view/2869 说明:1是6的约数。除了1之外,它还有3个6的约数:2、3和6。6总共有4个约数,是有4个约数的最小数。关于除数,给定一个数n,有n个除数的最小数是多少?

我尝试了两个几乎相同模式的代码,结果超出了时间限制。该问题给出了在 MOD 100000007 (Bigmod) 中解决的提示,但我无法在 BigMod 公式中找到解决方法。

#include <bits/stdc++.h>

using namespace std;
int divisors(int);

int main() 
{
    int input = 0,tc;
    cin>>tc;
    while(tc--){
        cin>>input;
        cout<<divisors(input)<<endl;
    }
    return 0;
}
int divisors(int input)
{
    int base = 1;
    int divisorNum = 0;
    int num = 0;
    while(divisorNum != input)
    {
        num = 0;
        for(int i = 1;i <= base; i++)
        {
            if(base%i==0)
            {
                num++;
            }
        }
        divisorNum = num;
        base++;
    }
    base-=1;
    return base;
}

我知道这个系统对于较大的数字非常耗时。但我不知道缩短时间的系统。确切的问题可以在这个网址中看到:https://www.urionlinejudge.com.br/judge/en/problems/view/2869

【问题讨论】:

  • 由于 n 最多为 100,因此您可以预先计算一个列表 L,使得 L[i] 是具有 i 个除数的最小数,其中 i = [1, 100]。
  • 只是一个小提示,您可以从 for 循环中排除 1 和 base 并从 divisorNum = 2 开始,输入的特殊情况 == 1
  • 另一个优化思路:任何 > 1 的数至少有两个除数(1 和它自己)。而第二大除数总是小于或等于数字的一半,所以你不需要检查所有的数字,只需检查一半即可。

标签: c++ uri


【解决方案1】:

首先考虑如何计算正整数的除数。以12为例。

您可以简单地从 1 枚举到 12,并检查枚举的数字是否能整除 12:1, 2, 3, 4, 6, 12。或者您可以进行素数分解:12 = 2^2 * 3^1。如果一个除数写成2^m * 3^n的形式,那么m有三种可能0, 1, 2n有两种可能0, 1,因此有3 * 2 = 6除数。

那么如何使用例如24 除数创建一个最小数字?您首先对2424 = 3 * 2 * 2 * 2 进行素数分解。那么您要查找的号码是2^(3-1)*3^(2-1)*5^(2-1)*7^(2-1)。所以基本上你对n 进行素数分解以获得k 术语并按降序对它们进行排序(a_1a_2、...、a_k)。您想要的数字是p_1 ^ (a_1 - 1) * p_2 ^ (a_2 - 1) * ... * p_k ^ (a_k - 1),其中p_iith 素数(即p_1 = 2, p_2 = 3, p_3 = 5, p_4 = 7...)。虽然它没有被严格证明,但它是“直觉上正确的”:)(引用自我的应用数学的朋友)。严格证明它需要一些严格的数学,这超出了我的能力(就目前而言),并且不太适合 StackOverflow。

(注意x ^ y 的意思是“x 的 y 次方”,而不是 x xor y。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2020-01-01
    • 2015-12-09
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多