最近我看到了数论问题,其中我需要找到对(x,y)的数量给出x ^ k + y ^ k = n的解,其中给出k和n。我带来的唯一解决方案是强力所有可能的x,y对并检查它们是否等于n。但我需要对大n和k,1&lt; = n&lt; = 10 ^ 18,1 <= k <= 100进行此操作。 最有效的方法是什么?
答案 0 :(得分:3)
一种可能的方法是使用a hash table。
首先,计算所有值x k ,其结果低于n。将每个这样的值添加到哈希表中,映射x k - &gt; x(而不是相反,它会在一瞬间明白为什么)。
然后,从哈希集中迭代键x k ,并检查补码 ie n - x k 是否也是哈希集中的一个键。
如果n - x k 也是一个关键字,那么哈希表会将其映射到值y,这样n - x k = y k ,我们确定了一个有效的(x,y)对。
否则,如果n - x k 不是哈希表的关键字,则没有解决方案,其中x是一个元素。
上述基本理念有所改进。例如,如果找到一个好的对(x,y),那么这意味着(y,x)也是一个好的对。使用它,人们无法测试n / 2以上的x值,因为这会导致已经枚举的对。
修改
正如Dmitry Bychenko在评论部分所指出的,有些情况下这种方法会占用大量内存,因此不太可行。
这个问题对于k = 2是最明显的,因为当k增加时,x k
对于k = 2,可以在不使用哈希表的情况下解决问题,而是直接检查n - x 2 是否为完美平方。要检查数字是否是完美的正方形,可以应用sqrt函数并检查结果是否为整数值。
对于任何k,具有O(1)空间复杂度的另一种方法是使用二进制搜索来检查n - x k 是否是整数的k次幂。这在O类中具有时间复杂度(n 1 / k * log(n))