Re[3]: решение
От: TheGrey Украина http://www.uoi.kiev.ua
Дата: 18.11.02 16:12
Оценка: 1 (1)
Здравствуйте, Nelud, Вы писали:

N>Есть у нас много-много чисел и надо среди них наити сумму нескольких чисел такую, что бы она делилась на данное нам число N. Проблема в том что стоит ограничение времени и перебор не поможет, нужно что то другое придумать.


Конечно, ее можно решать и полным перебором (это я в защиту умного человека), но, как правильно было отмечено — времени может не хватить.

Будем искать множество индексов чисел в исходной последовательности. Рассмотрим n чисел a_1, a_1+a_2, ..., a_1+...+a_n, и остатки от деления их на n: r_1, r_2, ..., r_n. Если найдется число i, такое что r_i=0, то множество{1,2,...,i} — искомое. Если нет, то найдутся i, j: r_i=r_j, (по принципу Дирихле!) т.к. остатки r_1, r_2, ..., r_n не принимают более n-1 различных значений. Тогда множество {i+1,...,j} — ответ.

Из приведенных математических выкладок ( ) следует, что искомое множество индексов существует всегда, и существует хотя бы одно множество, элементы которого идут подряд. А вот если бы нам нужно было отыскать такие числа, сумма которых была бы n (а не делилась на n), то задача из линейной превратилась бы в NPC!

Подчеркивание означает индекс (ну, как в ТеХ-е).

Эта задача была предложена в 95 году на всеукраинской олимпиаде (школьников) по информатике.

http://www.uoi.kiev.ua/digest/uoi/1995/task11.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.