2014-11-29 3 views
3

Назовите каждое субанитарное соотношение с его знаменателем мощностью 2 a perplex.Полномочия половины этой суммы до одного

Номер 1 может быть написан многими способами как сумма недоумений. enter image description here

Назовите каждую сумму недоумений дзета. Два зета отличаются друг от друга тогда и только тогда, когда одна из дзета имеет как минимум одно недоумение, которое у другого нет. На изображении, показанном выше, последние два зета считаются одинаковыми.

Найти все числа способов 1 можно записать в виде дзеты с N недоумениями. Поскольку это число может быть большим, вычислите его по модулю 100003.

Пожалуйста, не публикуйте код, а скорее алгоритм. Будьте как можно точнее.

Эта проблема была дана на конкурсе, и официальное решение, написанное на румынском языке, было загружено в https://www.dropbox.com/s/ulvp9of5b3bfgm0/1112_descr_P2_fractii2.docx?dl=0 в виде файла docx. (вы можете использовать перевод google) Я не понимаю, что хотел сказать автор решения.

+0

Части, за которыми я могу следить, это то, что для данного N существует представление 1, которое достигает наибольшего знаменателя (сумма степеней от 1/2 до (1/2)^(N-1), плюс (1/2)^(N-1)) и что, начиная с этого представления, вы можете заменить экземпляр (1/2)^m другим представлением 1, умножив его знаменатели на 2^m, давая вы более длинное представление 1. Подсчитав уникальные способы, чтобы это можно было сделать с представлениями короче N, я считаю, что он предлагает способы достижения N. – hobbs

+0

Например, одно представление с N = 5 начинается с принятия 1 = 1/2 + 1/4 + 1/4 и заменяя 1/2 1/4 + 1/8 + 1/8 (уменьшение случая N = 3 на 1/2), чтобы получить 1/4 + 1/4 + 1/4 + 1/8 + 1/8; другой заменяет оба экземпляра 1/4 с 1/8 + 1/8 (уменьшение случая N = 2 на (1/2)^2), чтобы получить 1/2 + 1/8 + 1/8 + 1/8 + 1/8 – hobbs

+0

Мне, возможно, не хватает точки, но, по моему мнению, количество возможностей бесконечно. Вы можете увеличить вдвое меньше, чем хотите. 1/4 может быть заменен двумя 1/8s, 1/8 может быть заменен двумя 1/16s .... –

ответ

0

Ну, это напоминает мне алгоритмы BFS (первый поиск по ширине), где вы излучаете из одной точки, чтобы найти несколько решений с различными перестановками.

Здесь вы можете использовать рекурсию и задавать базовый регистр, как если бы в 1 столбец вызова рекурсивной функции были достигнуты N недоразумений.

Таким образом, вы можете сказать:

function(int N <-- perplexes, ArrayList<Double> currentNumbers, double dividedNum) 
if N == 0, then you're done - enter the currentNumbers array into a hashtable 
clone the currentNumbers ArrayList as cloneNumbers 
remove dividedNum from cloneNumbers and add 2 dividedNum/2 
iterate through index of cloneNumbers 
    for every number x in cloneNumbers, call function(N--, cloneNumbers, x) 

Это грубый, очень неэффективно, но короткий путь, чтобы сделать это. Очевидно, есть много способов, с помощью которых вы можете сократить алгоритм (уменьшите количество дубликатов, попадающих в хэш-таблицу, предотвратите клонирование как можно больше и т. Д.), Но поскольку это показывает абсолютную перестановку каждого числа, а затем вводит эту последовательность в hashtable, хэш-таблица будет использовать сравнение equals(), чтобы увидеть, что последовательность уже существует (например, ваши последние 2 zetas) и отклонить дубликат. Таким образом, вы останетесь с ответом, который вы хотите.

Эффективность текущего алгоритма: O (| E |^(N)), где | E | - это абсолютное число чисел, которое вы можете иметь внутри массива в конце всех вставок, а N - количество вставок (или, как вы сказали, количество недоумений). Очевидно, что это не самая оптимальная скорость, но она определенно работает.

Надеюсь, это поможет!

+0

Спасибо за ответ! Хотя у меня проблемы с пониманием ... что такое «N <- недоумения»?Не могли бы вы переписать этот пост с использованием более формального/основного языка? (Например, не использовать такие слова, как «клонирование») –

Смежные вопросы