Я недавно играл в HackerRank в свое время простоя, и у меня возникли проблемы с решением этой проблемы: https://www.hackerrank.com/challenges/functional-programming-the-sums-of-powers эффективно.Экспресс X как сумма N-й степени уникальных натуральных чисел
Постановка задачи: Даны два целых числа X и N, найти число способов выразить X
в виде суммы степеней N
уникальных натуральных чисел.
Пример:Х = 10, Н = 2
Существует только один путь получить 10 с использованием силы ниже 10, и что это 1^2 + 3^2
Мой подход
Я знаю, что, вероятно, существует хорошая, элегантная повторяемость этой проблемы; но, к сожалению, я не смог его найти, поэтому начал думать о других подходах. То, что я решил, что я собирал диапазон чисел от [1,Z]
, где Z - наибольшее число меньше X при поднятии до N. Поэтому для приведенного выше примера я рассматриваю только [1,2,3]
, потому что 4^2 > 10
и, следовательно, не может быть частью (положительных) чисел, сумма которых равна 10. После сбора этого диапазона чисел я поднял их все на мощность N, затем нашел перестановки всех подмножеств этого списка. Итак, для [1,2,3]
я нашел [[1],[4],[9],[1,4],[1,9],[4,9],[1,4,9]]
, а не тривиальную серию операций для больших начальных диапазонов чисел (мое решение было ограничено на последних двух тестах хакерранка). Последним шагом было подсчет подсписок, которые суммировались с X.
Решение
object Solution {
def numberOfWays(X : Int, N : Int) : Int = {
def candidates(num : Int) : List[List[Int]] = {
if(Math.pow(num, N).toInt > X)
List.range(1, num).map(
l => Math.pow(l, N).toInt
).toSet[Int].subsets.map(_.toList).toList
else
candidates(num+1)
}
candidates(1).count(l => l.sum == X)
}
def main(args: Array[String]) {
println(numberOfWays(readInt(),readInt()))
}
}
Кто-нибудь сталкивался с этой проблемой раньше? Если да, есть ли более элегантные решения?