Вот как вы можете рассчитать значение.
Вы вычисляете значение, итеративно, для каждого числа цифр в двоичном представлении верхнего предела. Для каждого числа цифр вычисляется отдельно сумма степеней от 1 до 4 чисел с четным числом единиц и чисел с нечетным числом единиц в их двоичном представлении. Имея эти значения, вы должны иметь возможность вычислять значения для n + 1, где n - число цифр в двоичном представлении.
Вот некоторые замечания о том, как это сделать: если у вас есть сумма k-ых степеней чисел с четным числом единиц, то умножьте это на 2^k, и вы получите сумму этих чисел в два раза , У этих чисел все равно будет четное число. На самом деле каждое число с n числами, имеющими четное число, равно удвоенному числу с n-1 цифрами, имеющим четное число единиц, или x * 2 + 1, где x - число с нечетным числом единиц и имеет n - 1 цифра. Таким образом, сумма k-ых степеней чисел, имеющих четное число единиц в их двоичном представлении и имеющих n цифр, равна Se(n,k) = 2^k * Se(n-1, k) + Sum(a : number with odd number of ones and n-1 digits){(2*a + 1)^k}
. Здесь я использую Se для обозначения суммы чисел с четным числом единиц. Теперь интересная часть - второе слагаемое. Его можно рассчитать, используя биномиальную формулу:
(2 * a + 1)^k = 2^k * a * k + комбинация (1, k) * (2 * a)^(k-1) + ... 1 И вот после перегруппировки вас есть: Sum(a : number with odd number of ones and n digits){(2*a + 1)^k} = 2^k*So(n-1,k) + combination(1, k) * 2^(k-1)*So(n-1,k) + combination(2, k) * 2^(k-2)*So(n-1,k) + ...
Теперь, если вы предполагаете, что вы так (сумма чисел с нечетным числом единиц в двоичном представлении), вычисленный для п-1 можно также рассчитать эту сумму ,
Вы должны написать аналогичную формулу для So (п, к):
So (п, к) = 2^к * (So (п-1, к)) + Сумма (а: число с EVEN количество единиц и n-1 цифр) {(2 * a + 1)^k
Помните, что вам нужно вычислить эти значения для k = 1, ... 4, чтобы вы могли использовать их для следующая итерация. Только одно примечание - для So (n, 1) имеем So (n, 1) = So (n-1,1) * 2 + Se (n-1,1) * 2 + 1, аналогично Se (n, 1) = Se (n-1, 1) * 2 + So (n-1, 1).
Используя эти формулы, вы сможете вычислить необходимое вам значение довольно быстро. Вам нужно суммировать Se (1,4) + Se (2,4) + ... Se (64, 4). Алгоритм будет работать для значений, значительно превышающих заданные ограничения. Обратите внимание, что значение, которое вы ищете, не поместится ни в один «обычный» целочисленный тип. Вам нужно будет использовать какую-то реализацию BigInteger.
Надеюсь, это ответит на ваш вопрос.
Каждое второе число имеет четное число бит, поэтому будет около 2^63 = 9223372036854775808 таких чисел. Если вы планируете итерации через них, динамическое программирование вам не поможет. Я думаю, вам нужно будет найти некоторую разделительную математическую связь между числами и упростить проблему, прежде чем начинать писать «для» -loops. – aioobe