【发布时间】: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 和它自己)。而第二大除数总是小于或等于数字的一半,所以你不需要检查所有的数字,只需检查一半即可。