最近我看到,给出了解决数论问题,我需要找到对(X,Y)的量x^k + y^k = n,其中给出k和n。我唯一的解决方案是暴力破解所有可能的x,y对,并检查它们是否等于n。但是,我需要做的是为大n和k,1 < = N < = 10^18,1 < = K < = 100。 什么是最有效的方法呢?查找量,其中x-1K-+ Y^K = N
回答
一种可能的方法是使用a hash table。
首先,计算所有的值x ķ,为此,结果低于ñ。将每个这样的值添加到散列表中,映射到x(其他方式,而不是其他方式)。
之后,迭代通过键X ķ从散列集,并检查是否补体,即 N - X ķ也是在哈希集合的密钥。
如果n - X ķ也是一个键,则该哈希表将其映射到值y,使得n - X ķ = Y ķ,我们确定了有效的(X, y)对。
否则,如果n - x k不是散列表的关键,那么没有解决方案,其中x是一个元素。
对上述基本思想进行了改进。例如,如果找到一个好的对(x,y),那么这意味着(y,x)也是一对好的对。使用这种方法,无法测试n/2以上的x值,因为这会导致已经列举的配对。
编辑
正如梅德Bychenko在评论部分指出,存在该方法使用大量内存的情况下,使其不太可行。
此问题是最明显的,其中k = 2,因为随着k增加,有显著更少x值对于其中x ķ <ñ。
对于k = 2,可以在不使用哈希表的情况下处理该问题,而是直接检查n-x是否是完美正方形。要检查一个数是否是一个完美的正方形,可以应用sqrt函数并检查结果是否为整数值。
的另一种方法,用O(1)空间复杂度对任意k,是使用二进制搜索,用于检查是否N - X ķ为整数的第k功率。这在类O中具有时间复杂度(n 1/k * log(n))
如果n <= 10^18'和'k == 2'然后我们必须计算多达*十亿*项... –
谢谢,好点,我编辑了答案。 – qwertyman
- 1. 查找2^n的第一个数字,其中n的顺序是10^5
- 2. 如何查找和n更改&N
- 3. 查找溶液复发:T(N)= 2 T(N/4 +√N)+(√10)N
- 4. Pascal's Triangle - 查找第n行
- 5. 查找n维邻居
- 6. 如何使图标重复N次,其中N是变量?
- 7. 查找地图中最高的n值
- 8. 查找int中的第n个SET位
- 9. 查找SQL中第N大元素
- 10. 编解码器的矢量[N]其中N确定矢量的末尾
- 11. 从n个组中查找所有组合的大小n
- 12. 查找C中N个个案之间的偶数N
- 13. 在Java中查找2d n * n矩阵的逆?
- 14. 查找其中值属于
- 15. 查找并替换字符串模式N次,其中N在模式中定义
- 16. 通过其中一个值在向量中查找对象
- 17. 查找给定n个键的二叉树数量的变化
- 18. 查找列表中最高的n个元素及其位置。 Python
- 19. 查找其中2米范围重叠
- 20. C - 在float中查找int变量
- 21. 查找其ID与
- 22. 从其他表单中查找变量值
- 23. 查找其中矢量的差大于1
- 24. 查找进程ID并将其分配给ubuntu中的变量
- 25. 索引匹配,其中查找值在查找数组中
- 26. 如何查找数组中大于其后所有元素的元素数量?
- 27. 在MySQL中查询查找第N个最大值
- 28. 插入n个数据帧,其中n是在其他列表
- 29. 查找僵尸其中id = 1,并将其存储在一个变量
- 30. 查找的向量C++
许多可能的优化,但第一个:不需要强制*对*。对于每个候选'x',找到'n - x^k'并确定它是否是第k次方。(当然,你需要特殊情况'k = 1',并且'k = 2'也有数字理论技巧可用。) –
'x'和'y'是* positive *? –
@DmitryBychenko是的,x和y是自然数 – MRMKR