我在尝试解决以下问题时遇到了困难:
对于Q查询,Q&lt; = 1e6,其中每个查询是正整数N,N <= 1e18,找到[1,N]中不能为的整数数 每个查询除以[2,10]中的整数。
我想过使用筛子方法来筛选每个查询[1,1e18]中的数字(类似于eratosthenes的筛子)。但是,N的值可能非常大。因此,我无法使用这种方法。我能做出的最有用的观察是以0,2,4,5,6,8结尾的数字是无效的。但这对我这个问题没有帮助。
我看到了类似problem的解决方案,该解决方案使用较少数量的查询(Q <= 200)。但它对这个问题并不起作用(我不理解这个解决方案)。
有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:3)
[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 :(得分:0)
以下是如何处理此问题的方法。
开始的地方是考虑如何将其拆分成碎片。有了这样的问题,一个起点就是最小公分母(LCD) - 在这种情况下为2,520(所有小于10的数字都可以分割的最小数字)。
这个想法是,如果x不能被2-10中的任何数字整除,那么x + 2,520也不能被整除。
因此,您可以将问题分为两部分: