【问题标题】:Count of Coprimes for each number每个数字的互质数
【发布时间】:2019-11-15 05:30:12
【问题描述】:

我最近在招聘挑战中遇到了这个问题:

给定一个区间 [L, R] (1

例如L = 3,R = 7

对于 K = 3,[3, 7] 中的互质数 = 3 (4, 5, 7)

对于 K = 4,[3, 7] 中的互质数 = 3 (3, 5, 7)

对于 K = 5,[3, 7] 中的互质数 = 4 (3, 4, 6, 7)

...

通过我的方法,我找到了直到 R 的素数,然后对于每个 K,通过它的素数,计算互素的数量,但我需要比这更好和更有效的方法。提前致谢。

【问题讨论】:

  • hi pratik ,如果您发布代码的 sn-ps 会更好。每当您发布问题时,请也输入代码
  • 哇,这个招聘挑战似乎异常艰难。它需要数学知识。你知道包含排除定理吗?
  • 阅读@qwertyman 的回答,它实际上与我的想法非常接近。需要注意的一件事是,对于 10^5)。其次,我们可以使用eratosthenes筛法快速计算出2到10^5之间的所有素因数
  • @PhamTrung 它的变体 the smallest factor sieve 准确地说,它存储数字的最小因子而不是布尔值。

标签: algorithm math data-structures primes


【解决方案1】:

一种方法如下。

对每个数字 K 执行以下步骤:

  1. 求 K 的质因数(让我们将此集合表示为 D)。
  2. 使用包含-排除原则计算[L,R]区间中至少是D中一个数的倍数的数。这个数表示不为NOT的数的个数与 K 互质。
    • 您可以在this answer(我的)中查看有关此包含-排除方法的更多详细信息。
    • 该问题涉及任意集合 D(不一定由素数组成)——在我们的例子中 D 包含素数,因此来自该答案的最低公倍数 (lcm) 调用可以在此处更直接地计算为当前子集中的数字。
  3. 最后,要找到与 K 互质的数量,请从 [L, R] 区间中的值总数中减去先前找到的数字。

备注:在第 2 步中,我们可以类似地使用包含-排除原理来直接计算与 K 互质的数(但是,我觉得计算D组中的数字)。这不再需要第 3 步。

【讨论】:

  • 我之前已经考虑过这种方法,但是,我认为素数子集的数量将超出使用包含-排除的范围
  • 可能还是可行的——最多有|D| = 每个小于 10^5 的数有 6 个素因子(因为 2 * 3 * 5 * .. * 17 > 10^5),所以最多有 64 个子集(但是,只有少数 K 会有 6 个素因子)。每个子集都可以在 O(|D|) 中处理。我们可以通过考虑有多个具有相同集合 D 的数字 K 来额外提高执行时间。
  • 是的,现在知道了,我们可以在这里应用包含-排除。谢谢。
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2021-10-21
  • 2015-04-18
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多