计算给定数N的“酷”除数

时间:2017-06-20 20:24:33

标签: algorithm numbers

我正试图用除数和数论解决相当复杂的问题。

即使对于给定数字 m ,如果 k < m ,我们可以说 k 是很酷的除数 k | m (k均匀划分m),对于给定数字 n ,数字k ^ n(k为n的幂)不是 m 的除数。设s(x) - x的酷除数。

现在给定a和b我们应该找到D = s(a)+ s(a + 1)+ s(a + 2)+ s(a + 3)+ ... + s(a + b) 。

所有值的限制: (1&lt; =&lt; = 10 ^ 6),(1 <= b <= 10 ^ 7),(2 <= n <= 10)

示例

假设a = 32,b = 1,n = 3;

x = 32,n = 32的除数为{1,2,4,8,16,32}。但是只有{4,8,16}填充条件,所以s(32)= 3

x = 33,n = 3的除数33是{1,3,11,33}。只有数字{3,11}填满条件,所以s(33)= 2;

D = s(32)+ s(33)= 3 + 2 = 5

我尝试了什么

我们应该在3秒的时间内回答100个测试用例的所有问题。

我有两个想法,第一个:我在区间[a,a + b]中迭代,对于范围内的每个值,我检查该值有多少很酷的除数,我们可以在O中检查(sqrt(N))如果获得N的幂数的函数被认为是O(1),那么它的总函数是O(B * sqrt(B))。

第二个,我现在确定它是否会起作用,它会有多快。首先我进行预计算,我有一个for循环,从1到N迭代,其中N = 10 ^ 7 现在在[2,N]的范围内,每个数的除数是i,其中i在[2,N]范围内,我检查i的幂是否不是j的除数然后我们更新数字j还有一个很酷的除数。有了这个,我认为复杂性将是O(NlogN)和答案O(B)。

1 个答案:

答案 0 :(得分:1)

你的第一个想法有效,但你可以改进它。

不是检查从1到sqrt(N)的所有数字是否都是冷除数,而是可以分解N = * p0 ^ q0 * p1 ^ q1 * p2 ^ q2 ... pk ^ qk *。那么冷酷除数的数量应该是 (q0 + 1)(q1 + 1)...(qk + 1) - (q0 / n + 1)(q1 / n + 1).. (QK / N + 1)

因此,您可以先使用现有算法(如 Eratosthenes筛选)预先处理并查找所有素数,并对[a,a + b]之间的每个数字N进行分解。复杂性应大致为O(BlogB)。

你的第二个想法也适用。

对于[2,a + b]之间的每个数字i,你可以检查[a,a + b]之间的i的倍数,看看我是否是这些倍数的一个很酷的除数。复杂性也应该是O(BlogB)。在这个想法中可以玩一些技巧来加速程序,一旦你不需要不时使用除法/模式操作来检查我是否是一个很酷的除数。您可以计算[a,a + b]之间的第一个数m,即i ^ n | m。这个m应该是 m = ceiling(a /(i ^ n))(i ^ n)。然后你知道i ^ n | m + p * i在[1,i ^(n-1)-1]之间不存在p并且对于p = i ^ n-1成立。基本上,你知道我不是每个i ^(n-1)倍数都是一个很酷的除数,你不需要使用divide / mod来计算它,这会加快程序的速度。