Максимальное число для
A+B бит =
С =
2^(A+B) - 2^B, т.е. для 9 бит это 2^9-2^2 = 512-4 = 508
Нужно найти все числа от
N до
С включительно, которые делятся на
N без остатка (по сути являются произведением
N на индекс цикла от
1 до
(C div N) включительно), и проверить, являются ли они суммами не повторяющихся степеней двойки, и если являются, то равняется ли количество чисел в сумме значению
A. Т.е. проверяем, все ли
A бит задействованы.
Для данного случая при
N = 25,
508 div 25 = 20 (итераций). Нужно проверить является ли произведение индекса цикла на
N суммой из
A (7) чисел (не повторяющихся степеней двойки от 0 до
A+B-1 (8)).
Числа (степени двойки) можно предварительно вычислить и сложить в массив, и доставать оттуда по индексу.
Таким образом самое сложное, что нужно написать, это функцию, которая будет проверять, является ли её аргумент суммой
A не повторяющихся степеней двойки от 0 до
A+B-1.
Проверять все не нужно, можно прерывать выполнение на первом положительном результате.
Быстро проверять на степень двойки можно через битовую операцию сравнения И
Например K = 13 (8+4+1), тогда K & 1 = 1, K & 2 = 0, K & 4 = 4, K & 8 = 8. Т.е. очевидно, что если K & 2^i > 0, то число содержит степень двойки. Ну и останется считать для каждого числа, сколько степеней двойки оно в себе содержит.
Опять же, сверять надо не со всеми степенями двойки, а с ближайшей меньшей от K, т.е. для K=28, максимальная степень двойки для сравнения будет равна 16. Для K=50 - 32, для К=100 - 64 и т.д.
Нужно будет как-то вычислять эту степень, лучше всего лениво. Просто вычисляя очередное К, проверить, больше ли оно следующей степени двойки.
https://codedump.io/share/hMw9j5suUF41/1/doesbinar... вот беглое решение на JS
PS: решение нуждается в оптимизации, но это уже самостоятельно :)