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. С каждым полученым числом всё повторяется снова пока результат вычитания положителен. Сложно? Смотрите картинку, так понятнее.
Нужно посчитать: 1) СУММУ всех чисел N 2) Колличество нечётных N Господа-товарищи программисты, убедительная просьба не беспокоится. Я знаю, что эта задачка решается элэментарной рекурсией в три строчки. И уже это сделал, НО! При N=50000 и s=300 эта рекурсия длится несколько дней. Мне нужно МАТЕМАТИЧЕСКОЕ решение с минимальным вычислением и максимальной скоростью. Очень приветствуется всякий флуд и флэйм, поскольку он может натолкнуть на идею. Если кто знает как вообже в математике называется что-то подобное, тоже буду признателен. |
Posted by: Гордый on 01-08-2009, 19:28 | ||
|
Posted by: anatolyArts on 01-08-2009, 19:33 |
Не знаю как с нобелевкой, но если кто решит - за мной не заржавеет |
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 | ||
P.S. А что если S = -1 ? |
Posted by: anatolyArts on 03-08-2009, 20:13 | ||||||||
НО КАК БЫТЬ ДАЛЬШЕ?!!!!
|
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 | ||
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 | ||
|