Printable Version of Topic
Click here to view this topic in its original format
Forums > Флейм > Нужна помощь зала, Математики, где вы?


Posted by: anatolyArts on 01-08-2009, 15:35
Привет.

Мне нужно решить вот такую задачку:
Есть "треугольник" который строится из двух параметров.
1) Начальное число N
2) Стартовое вычитаемое число s
Строится "треугольник" так: из N вычитаются все натуральные числа от s до 3-х включительно. Из каждого получившегося числа (назовём их N1, N2, ... Nx) снова вычитаются s, но для N=N1 -> s=s, для N=N2 -> s=s-1, для N=N3 -> s=s-2, для N=N4 -> s=s-3, для N=Nx -> s=3. С каждым полученым числом всё повторяется снова пока результат вычитания положителен. Сложно? Смотрите картинку, так понятнее.
SPOILER!

Нужно посчитать:
1) СУММУ всех чисел N
2) Колличество нечётных N

Господа-товарищи программисты, убедительная просьба не беспокоится. Я знаю, что эта задачка решается элэментарной рекурсией в три строчки. И уже это сделал, НО! При N=50000 и s=300 эта рекурсия длится несколько дней. Мне нужно МАТЕМАТИЧЕСКОЕ решение с минимальным вычислением и максимальной скоростью.

Очень приветствуется всякий флуд и флэйм, поскольку он может натолкнуть на идею. Если кто знает как вообже в математике называется что-то подобное, тоже буду признателен.

Posted by: Гордый on 01-08-2009, 19:28
QUOTE (anatolyArts @ 01-08-2009, 14:35):
Очень приветствуется всякий флуд и флэйм, поскольку он может натолкнуть на идею. Если кто знает как вообже в математике называется что-то подобное, тоже буду признателен.
Я насчёт по-флудить... а ты уверен, что эта проблема в математике уже решена? Может нобелевку за это дело положено? :actu: :diablo:

Posted by: anatolyArts on 01-08-2009, 19:33
Не знаю как с нобелевкой, но если кто решит - за мной не заржавеет :beer:

Posted by: Ben on 02-08-2009, 00:56
Есть у мну ректальное впечатление, что решение факториально зависит от параметра Н. Нобелевкой здесь, конечно, не очень пахнет, но какая нить премия в теории чисел - стопудово :)

Posted by: Set on 02-08-2009, 21:10
Рекурсией "в лоб" - там совсем нездоровые числа идут. :) Пихай сумму N и число нечётных N для каждой ветки в хэш-таблицу по её паре (N, s) - тогда не надо будет просчитывать одно и тоже для одинаковых веток.

Posted by: anatolyArts on 03-08-2009, 07:57
Set, я примерно так и делаю. Всё равно очень долго. Параметры всё время разнообразные и таблица в короткий срок сильно разростается. Что не приемлемо в этом случае ибо программа должна влазить в 2-3 килобайта. Поэтому, она(таблица) всё время урезается и содержит только базовые пары. Не сильное ускорение.

Posted by: FiL on 03-08-2009, 19:00
QUOTE (anatolyArts @ 01-08-2009, 08:35):

Строится "треугольник" так: из N вычитаются все реальные числа от s до 3-х включительно.
Не, ребята. С такими условиями оно работать не будет. Вычитать все реальные числа из некоего промежутка - это задача не для слабонервных :)

P.S. А что если S = -1 ? :)

Posted by: anatolyArts on 03-08-2009, 20:13
QUOTE (FiL @ 03-08-2009, 16:00):
Не, ребята. С такими условиями оно работать не будет.
Ну почему же? Вот первый шаг я, можно сказать, сделал: ту часть "треугольника" где числа ещё не отпадают я посчитал. Тут на картинке видно.
SPOILER!
Вертикальная сумма каждого этапа (до начала отпада) равна среднему арифметическому всех чисел этапа умноженному на колличество чисел. По природе "треугольника" чтобы посчитать среднее арифметическое, достаточно вычесть из N среднее число s. 25-((5+3)/2) и так по всем этапам. Колличесто же чисел соответствует диагонали номер s-2 треугольника паскаля.
SPOILER!
Всего "не отпадающих" этапов = N/s. Считается просто и быстро.

НО КАК БЫТЬ ДАЛЬШЕ?!!!! :fear2:


QUOTE:
P.S. А что если S = -1 ? :)
По определению s >= 3. Я просто забыл сказать.

Posted by: dmvn on 03-08-2009, 21:53
Чёрт возьми, зачем называть натуральные числа реальными? :) Исправьте, плз, а то не по-русски получается.

А задачка интересная. Ща подумаем.

Posted by: FiL on 04-08-2009, 06:04
чиста от нечего делать попробовал сохранять результаты от итерационных (рекурсивных) вычислений в массиве. По-простому, без всяких там хеш-функций. Не сильно оптимально по использованию памяти, конечно. Да и с точностью некоторые проблемы, ибо там суммы довольно быстро вылазят за 64 бита. Но (50000, 300) считается за 1 минуту и 6 секунд.

Да, я понимаю, что это далеко не 2-3 килобайта. Это даже не 2-3 мегабайта. Но может стоит табличку статично посчитать и держать в файле? И просто дергать из нее значения...

Кстати, если оно несколько дней считать рекурсивно может, то значит с памятью особых проблем нет. Как минимум стека хватает на туеву хучу рекурсивных вызовов :)

Posted by: anatolyArts on 04-08-2009, 07:38
QUOTE (dmvn @ 03-08-2009, 18:53):
Чёрт возьми, зачем называть натуральные числа реальными? :) Исправьте, плз, а то не по-русски получается.
Спасибо, исправил. Я просто плохо перевёл. Никогда не учил математику по русски. :)

FiL, это на девелопментовой машине и памяти и скорости хватает. А там где оно бежать будет могут быть проблемы.

Posted by: Enot Pk on 04-08-2009, 12:11
При третьем подходе в голове возникла мысль: "напишите программу деления для компьютера без заранее реализованной инструкции процессора".

Хорошая чесалка для мозгов, подвисают.

Posted by: FiL on 04-08-2009, 18:00
Енот,
ну писал я такое. И что? делить-то как раз не сложно.

Posted by: Lord KiRon on 04-08-2009, 19:22
FiL
LISP ?

Posted by: FiL on 04-08-2009, 21:03
QUOTE (Lord KiRon @ 04-08-2009, 12:22):
FiL
LISP ?
не, при чем тут лисп? просто нужна была как-то библиотека для работы с целыми числами произвольной длины. Ну и писал что-то подобное. Умножение, деление... сначала реализовав сложение и вычитание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)