- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用除数和数论解决相当复杂的问题。
也就是说,对于给定的数字 m,我们可以说 k 是很酷的除数,如果 k<m < em>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 <= a <= 10^6), (1 <= b <= 10^7), (2<=n<=10)
示例
假设 a=32,b=1,n=3;
x = 32,n = 32 的 3 个约数是 {1,2,4,8,16,32}。然而只有 {4,8,16} 满足条件所以 s(32) = 3
x = 33,n = 33 的 3 个约数是 {1,3,11,33}。只有数字{3,11}满足条件所以s(33)=2;
D = s(32) + s(33) = 3 + 2 = 5
我尝试过的
我们应该在 3 秒的时间限制内回答所有 100 个测试用例的问题。
我有两个想法,第一个:我在区间 [a, a+b] 中迭代,对于范围内的每个值 i,我检查该值有多少个很酷的除数,我们可以在 O 中检查这个(sqrt(N)) 如果获取 N 的幂数的函数被认为是 O(1),那么总的函数是 O(B*sqrt(B))。
第二个,我现在确定它是否有效以及速度有多快。首先我进行预计算,我有一个从 1 迭代到 N 的 for 循环,其中 N = 10^7现在在 [2, N] 范围内,对于每个除数为 i 的数字,其中 i 在 [2,N] 范围内,我检查我的 n 次方是否不是 j 的除数,然后我们更新该数字j 还有一个很酷的除数。有了这个,我认为复杂度将是 O(NlogN),而答案是 O(B)。
最佳答案
您的第一个想法可行,但您可以改进它。
您可以分解 N=*p0^q0*p1^q1*p2^q2...pk^qk*,而不是检查从 1 到 sqrt(N) 的所有数字是否是很酷的除数。那么冷除数的数量应该是 (q0+1)(q1+1)...(qk+1) - (q0/n+1)(q1/n+1).. .(qk/n+1).
因此,您可以首先使用埃拉托色尼筛法 等现有算法预处理并找出所有质数,然后对 [a,a+b] 之间的每个数字 N 进行因式分解。复杂度应该大致为 O(BlogB)。
您的第二个想法也可行。
对于 [2,a+b] 之间的每个数字 i,您可以只检查 [a,a+b] 之间 i 的倍数,看看 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 不是每 i^(n-1) 倍的一个很酷的除数,并且您不需要使用除法/模来计算它,这将加快程序速度。
关于algorithm - 计算给定数 N 的 "cool"个除数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44662380/
我遇到了一个问题,想要了解更多信息以及如何避免。我有这个代码 len :: (Num r ) => [a] -> r len [] = 0 len xs = 1 + len ( tail xs ) a
我知道如何找到给定整数(1 除外)的除数: let smallest_divisor n = let rec aux n i = if i 编辑添加:在平均情况下,第二种方法
这个问题已经有答案了: Why does integer division code give the wrong answer? [duplicate] (4 个回答) 已关闭去年。 在 Java
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26). scala> 1.0 / Doub
我的数据帧结构如下,x_L 和 x_R 对的数量可能最多为 100。 ID Side A_L A_R B_L B_R 1 0 7 5 6 3 2
我的数据帧结构如下,x_L 和 x_R 对的数量可能最多为 100。 ID Side A_L A_R B_L B_R 1 0 7 5 6 3 2
如何使用转换将数字列表除以 2?我以为这段代码可以做到,但它只将整个列表的数字 1 除以 2,所以我一定完全误解了这一点。有人能帮助我吗? :) list v(5, 1); list d; d.res
我目前正在研究如何使用各种现代处理器的快速单精度浮点倒数功能来计算基于定点 Newton-Raphson 迭代的 64 位无符号整数除法的起始近似值。它需要尽可能准确地计算 264/除数,其中初始近似
我是一名优秀的程序员,十分优秀!