【问题标题】:Number of positive integers in [1,1e18] that cannot be divided by any integers in [2,10][1,1e18] 中不能被 [2,10] 中任何整数整除的正整数个数
【发布时间】:2017-11-15 02:48:26
【问题描述】:

我在尝试解决以下问题时遇到了困难:

对于Q个查询,Q

我想过使用筛法来过滤掉每个查询的 [1,1e18] 中的数字(类似于 eratosthenes 的筛子)。但是,N 的值可能非常大。因此,我无法使用这种方法。我能做出的最有用的观察是,以 0、2、4、5、6、8 结尾的数字是无效的。但这并不能帮助我解决这个问题。

我看到了一个类似problem 的解决方案,它使用较少数量的查询(Q

有人可以告诉我如何解决这个问题吗?

【问题讨论】:

  • 属于 math.stackexchange.com

标签: algorithm number-theory


【解决方案1】:

[2,10] 中唯一的质数是2, 3, 5, 7 的质数

所以,假设[2,10]中的数字不能被整数除,就是数字不能被{2,3,5,7}

这也等于[1,n] 之间的总数减去所有数字除以{2,3,5,7} 的任意组合。

所以,这就是有趣的部分:[1,n] 有多少个数字除以 2? 答案是n/2(为什么?很简单,因为每2个数,就有一个数除以2)

同样,有多少个数字被 5 整除?答案是n/5 ...

那么,我们有答案了吗?不,因为我们发现我们已经将除以 {2, 5} 或 {2, 7} 的数字加倍计算......所以现在,我们需要减去它们。

但是等等,看起来我们是双减除以 {2,5,7} 的那些......所以我们需要把它加回来

...

继续这样做,直到处理完所有组合, 所以应该有2^4个组合,一共16个,处理起来很小。

请查看Inclusion-Exclusion principle 以获得更好的理解。

祝你好运!

【讨论】:

  • +1 感谢您的解释!我现在理解代码了。 TLE 是因为我在帖子中链接的代码正在刷新每个查询的输出。
【解决方案2】:

这里有一个处理方法。

首先要考虑如何将其拆分为多个部分。对于这样的问题,从最小公分母 (LCD) 开始——在本例中为 2,520(可被所有小于 10 的数字整除的最小数字)。

这个想法是,如果 x 不能被 2-10 之间的任何数字整除,那么 x + 2,520 也不能被整除。

因此,您可以将问题分为两部分:

  1. 1 到 2,520 之间的数字与 2 到 10 之间的数字“相对质数”有多少?
  2. 有多少次 2,520 进入您的目标号码?您还需要考虑其余部分。

【讨论】:

  • @user3386109 。 . .我实际上意识到可以对这个问题进行优化。这个想法是为 OP 提供一种解决它的方法。
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多