【问题标题】:finding number of numbers which have prime number of factors查找具有素数因子的数字的数量
【发布时间】:2013-11-01 18:12:01
【问题描述】:

问题是求一个数的除数

前-

for 10 

ans=4

因为 1,2,5,10 是除数的数字

即他们是因素

约束数

我已经实现了相同的代码,但得到了 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;

}

谁能帮我优化一下?

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

所以请帮助大家。

【问题讨论】:

  • 编码很好。 :O 有人格式化它
  • 请正确缩进您的代码,以便我们阅读。
  • 所以在经过大量谷歌搜索后,我现在知道“TLE”是什么——超过了时间限制。
  • 不要直接从跑步比赛中提问codechef.com/NOV13/problems/PRETNUM
  • 这是 CodeChef 在 11 月进行的长期竞赛中的一个问题。直接在比赛中提问违反了 CodeChef 的行为准则。

标签: c algorithm


【解决方案1】:

您可以尝试以数学方式计算(我不确定这会更快/更容易)。基本上,给定一个数的素数分解,您应该能够轻松计算除数。

如果你有一个输入 x 分解成类似的东西

x = p1^a1 * p2^a2 * ... pn^an

那么除数应该是

prod(ai + 1) for i in 1 to n

然后我会寻找最小的素数

现在考虑上述语句所说的内容:素因数分解(加 1)的乘积中的除数。因此,如果您只关心结果是否为素数,那么您应该只考虑素数或素数的幂。在此范围内,您只需要考虑使 a1 + 1 为素数的幂。

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

【讨论】:

  • 是的,我忘了包括你只关心带素数的数字的事实。那么你只关心素数和素数的幂。
【解决方案2】:

如果一个数的素数分解是:

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 的素数,并在以后使用它们进行区间筛选。

您也可以在筛分时进行必要的计数。

【讨论】:

  • @RaunakTalwar - 你必须检查素数 + 1 的指数是否也是素数。 3 + 1 不是素数。指数将非常小(2^64 已经远远超过 10^12),所以这是一个简单快速的检查。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多