问题是要找到数字的除数数
前 -
for 10
ANS = 4
因为1,2,5,10是除数的数字
即。他们是因素
约束是num< = 10 ^ 6
我已经实现了相同的代码,但得到了TLE !!
这是我的代码
int isprime[MAX];
void seive()
{
int i,
j;
isprime[0] = isprime[1] = 1;
for (i = 4; i < MAX; i += 2)
isprime[i] = 1;
for (i = 3; i * i < MAX; i += 2) {
if (!isprime[i]) {
for (j = i * i; j < MAX; j += 2 * i)
isprime[j] = 1;
}
}
}
int main()
{
seive();
int t;
long long num;
scanf("%d", & t);
while (t--) {
scanf("%lld", & num);
cnt = 0;
for (j = 1; j * j <= num; j++) {
if (num % j == 0) {
cnt++;
if (num / j != j)
cnt++;
}
printf("%lld\n", cnt);
}
return 0;
}
有人可以帮我优化吗?
我也搜索过它,但没有得到任何成功。
所以请帮帮我们。
答案 0 :(得分:3)
如果数字的素数因子分解为:
x = p1^e1 * p2^e2 * ... * pk^ek
然后除数的数量为:
(e1 + 1)*(e2 + 1)* ... *(ek + 1)
为了使这成为素数,你需要所有ei
为0,除了一个,它需要是素数-1。
这仅适用于素数的素数和幂数。所以你需要找到[l, r]
中有多少素数的幂。例如,2^6
有(6 + 1) = 7
素因子。
现在你需要足够快地筛选足够的素数。您只需要筛选[l, r]
中的那些,所以间隔最大为10^6
。
要直接在此间隔内筛选,请直接从[l, r]
删除2的倍数,其余部分则相同。您可以筛选质数至10^6
并使用它们进行间隔筛分。
您也可以在筛分时进行必要的计数。
答案 1 :(得分:3)
您可以尝试以数学方式计算(我不确定这会更快/更容易)。基本上,考虑到数字的素数因子分解,你应该能够毫不费力地计算除数的数量。
如果您有输入x
分解为类似
x = p1^a1 * p2^a2 * ... pn^an
然后除数的数量应为
prod(ai + 1) for i in 1 to n
然后,我会看到找到最小的素数&lt; sqrt(x),除此之外,直到你只剩下一个素数。筛子可能仍然有用,我不知道你会得到什么样的输入。
现在考虑上述陈述所说的内容:素数因子化(加1)的乘积中除数的数量。因此,如果你只关心结果是否是素数,那么你应该只考虑素数或素数的数字。在那之内,你只需要考虑权力,使a1 + 1成为素数。
这应该会大大减少您的搜索空间。