找到具有素数因子的数字的数量

时间:2013-11-01 18:12:02

标签: c algorithm

问题是要找到数字的除数数

前 -

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;

}

有人可以帮我优化吗?

我也搜索过它,但没有得到任何成功。

所以请帮帮我们。

2 个答案:

答案 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成为素数。

这应该会大大减少您的搜索空间。