<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903104</guid>
        <pubDate>Tue, 16 Apr 2024 07:33:25 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903104</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>MBo</strong>, понятно<br>
спс за помощь  ;)]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903102</guid>
        <pubDate>Tue, 16 Apr 2024 07:21:47 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903102</link>
        <description><![CDATA[MBo: Не очень много времени, но я уже решал задачи на наборы подходящих сумм. <br>Если детали интересны, то создан файл Py в 14.47, а запостил Сообщ. #8 в 16.02 по моему времени. <br>Отвлекался, наверное, на работу ещё ;)<br><br>И сразу мне показалось, что ограничение будет трудно прикрутить, <br>а на втором заходе уже, когда ты про это конкретно спросил, как-то сразу получилось.]]></description>
        <author>MBo</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903095</guid>
        <pubDate>Tue, 16 Apr 2024 06:52:07 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903095</link>
        <description><![CDATA[FasterHarder: В общем все понятно по алгоритму ( на 95% ). Получается ответ: <strong class='tag-b'>34 602 572</strong> набора.<br>
Был еще такой момент с мемоизацией, что программа выдавала ответ 34 622 921 набор, что очень близко к прав. ответу, учитывая масштаб переборов.<br>
<br>
И вот это проверка победила эту проблему:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;if( !near_limit )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;map&#60; pair&#60; int, int &#62;, int &#62; :: iterator it = values.find( make_pair( sum, digits ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if( it != values.end() )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return it -&#62; second;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Вообще, вот эта переменная near_limit вроде в большинстве случаев равна false. Она равна true, когда текущий разряд достиг своего максимально допустимого значения.<br>
<br>
Кстати, насколько знаю, в таких вот алгоритмах бывают <strong class='tag-b'>тончайшие проблемы</strong>, связанные с ЗАПУСКОМ рекурсии, т е, чтобы она корректно отработала на самом первом вызове, т к бывает, что оттолкнуться не от чего. А в этом алго все четко, несмотря на то, что самый первый разряд обрабатываемый = 9...Для своего понимания я так решил, что есть какой-то фантомный разряд, стоящий перед 9кой, который достиг предела и делается переход уже на 9ку и как бы запустилась прожка с near_limit = true...<br>
<br>
Кстати, Питон как-то это все ( имею в виду обращения к таблице мемоизации, когда near_limit == false ) автоматически учел, что мне не на 100% понятно, но это ладно...<br>
<br>
По сравнению с полным перебором, этот алгоритм работает в 9 триллионов раз быстрее)), ну, грубо если.<br>
<br>
==============================================================<br>
<br>
<strong class='tag-b'>MBo</strong>, остался последний вопрос в рамках этой задачи: <span class="tag-color tag-color-named" data-value="red" style="color: red"><strong class='tag-b'>сколько всего времени ( в мин., например ) ты потратил на решение этой задачи?</strong></span> Речь про чистое время, не учитывая переписку здесь и пр. То есть прочитать условие + продумать алго + закодить.<br>
<br>
=============================================================<br>
<br>
всем спс. за помощь]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903018</guid>
        <pubDate>Sun, 14 Apr 2024 12:52:31 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903018</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>MBo</strong>, круто, спс, буду разбираться...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903017</guid>
        <pubDate>Sun, 14 Apr 2024 11:10:40 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903017</link>
        <description><![CDATA[MBo: Дополнил ограничением.<br>
<br>
Вначале создаётся список цифр числа-ограничения. Я его сделал не по-питонски, чтоб понятнее было (// - целочисленное деление)<br>
<br>
Если уже обработанный кусок совпадает с началом числа-ограничения, то ограничиваем очередную цифру соответствующей цифрой ограничителя (например, если имеем 92235 лимит и 922 цифры уже набрали в текущей ветке, то ограничиваем перебор цифрой 3)<br>
<br>
Информация о том, что по первым цифрам было достигнуто ограничение, передается в near_limit - этот флаг сбрасывается, если взятая цифра  меньше лимита (если в примере выше 922<strong class='tag-b'>1</strong> используем, то дальше уже за лимит не выйдем)<br>
<br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import math, functools</div><div class="code_line">&nbsp;</div><div class="code_line">limits = []</div><div class="code_line">t = 2**63-1</div><div class="code_line">while t:</div><div class="code_line">&nbsp;&nbsp; &nbsp;limits.append(t % 10)</div><div class="code_line">&nbsp;&nbsp; &nbsp;t //= 10</div><div class="code_line">&nbsp;</div><div class="code_line">@functools.lru_cache(9999)</div><div class="code_line">def cnt159(summ, dig, near_limit):</div><div class="code_line">&nbsp;&nbsp; &nbsp;if summ == 0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;res = 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;if near_limit:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;digmax = limits[dig-1]+1</div><div class="code_line">&nbsp;&nbsp; &nbsp;else:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;digmax = 10</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i in range(max(0, summ - 9*(dig-1)), min(digmax, summ+1)):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;res += cnt159(summ - i, dig - 1, near_limit and (i==limits[dig-1]))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return res</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">print(cnt159(159, 19, True))</div></ol></div></div></div></div>]]></description>
        <author>MBo</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903014</guid>
        <pubDate>Sun, 14 Apr 2024 07:08:24 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903014</link>
        <description><![CDATA[FasterHarder: Итак, на данный момент есть отличный алго ( from MBo )+прожка для нахождения всех подходящих наборов БЕЗ УЧЕТА ограничения на 2<sup class='tag-sup'>63</sup>.<br>
<br>
Как победить это ограничение на 2<sup class='tag-sup'>63</sup>? Вообще мыслей нет никаких?<br>
<br>
========================================================<br>
<br>
В неком алго from Mikle подход через массив частотностей цифр, но там ведь тоже местоположение разряда не учитывается вроде...<br>
<br>
--------------------------------------------------------<br>
<br>
Единственная идея, которая осталась - заводить массив из 19 элементов ( каждый элемент соот-ет разряду числа ) и чего-то там мутить, правда, что мутить абсолютно непонятно...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903006</guid>
        <pubDate>Sat, 13 Apr 2024 01:35:10 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903006</link>
        <description><![CDATA[FasterHarder: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3903003'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Mikle &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T15:41:16+00:00">12.04.24, 15:41</time></span><div class='quote '>Там при переборе рекурсией будет частое обрезание целых больших ветвей по условию &quot;сумма значений элементов не превысила 19, а сумма произведений значений элементов на их номера не превысила 159&quot;.</div></div><br>
безусловно<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3903003'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Mikle &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T15:41:16+00:00">12.04.24, 15:41</time></span><div class='quote '>Вот тут согласен.</div></div><br>
вот пример задачи из той же категории, что и текущая<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">Алгоритм вычисления значения функции F(n), где n  — натуральное число, задан следующими соотношениями:<br>
F(n)  =  n при n &gt; 2024;<br>
F(n)  =  n · F(n + 1), если n ≤ 2024.<br>
Чему равно значение выражения F(2022) / F(2024)?</span><br>
<br>
Сколько нужно времени, чтобы ее решить?)<br>
F( 2022 ) = 2022 * F( 2023 )<br>
F( 2023 ) = 2023 * F( 2024 )<br>
<br>
2022 * 2023 * F( 2024 )<br>
----------------------- = 2022 * 2023 = и тут аккуратно перемножить<br>
        F( 2024 )<br>
<br>
ну, за пару минут такое вроде можно сделать.<br>
А задача из первого сообщения, такое впечатление, не просто сложнее, а НА НЕСКОЛЬКО ПОРЯДКОВ сложнее...хм...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903003</guid>
        <pubDate>Fri, 12 Apr 2024 15:41:16 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903003</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3902964'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T07:39:58+00:00">12.04.24, 07:39</time></span><div class='quote '>То есть, если делать полный перебор, то это 20^10 вариантов, что &quot;рядом&quot; с 2^63...</div></div><br>
Там при переборе рекурсией будет частое обрезание целых больших ветвей по условию &quot;сумма значений элементов не превысила 19, а сумма произведений значений элементов на их номера не превысила 159&quot;.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3902964'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T07:39:58+00:00">12.04.24, 07:39</time></span><div class='quote '>в целом нелегко как-то, учитывая, что это задача уровня ЕГЭ</div></div><br>
Вот тут согласен.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3902964'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>FasterHarder &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T07:39:58+00:00">12.04.24, 07:39</time></span><div class='quote '>Ты упомянул про треугольник Паскаля, я так понимаю, что это больше для полноты картины и можно без него ведь.</div></div><br>
Это просто один из методов нахождения кол-ва вариантов перестановок.]]></description>
        <author>Mikle</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903000</guid>
        <pubDate>Fri, 12 Apr 2024 14:22:07 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3903000</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>MBo</strong>, спс за пояснение, теперь я на 100 ( ну, хорошо, на 99 )% понял эту конструкцию:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3902972'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T09:02:32+00:00">12.04.24, 09:02</time></span><div class='quote '>for i in range(max(0, summ - 9*(dig-1)), min(10, summ+1)):</div></div><br>
меня смутила 10ка сначала, но потом вспомнил, что правая граница не входит, т е пойдет до 9ки<br>
в целом очень лаконичная и точная запись перебора<br>
<br>
тем временем, у меня готов код на С++&#33;, как ты и подсказал, через map:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;map&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std;</div><div class="code_line">&nbsp;</div><div class="code_line">// для мемоизации данных</div><div class="code_line">map&#60; pair&#60; int, int &#62;, int &#62; values;</div><div class="code_line">&nbsp;</div><div class="code_line">// набор суммы ( sum ), используя digits разрядов </div><div class="code_line">int F159( int sum, int digits )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// проверим, а нет ли в таблице мемоизации уже рассчитанного готового значения для данной суммы с использованием заданного кол-ва разрядов</div><div class="code_line">&nbsp;&nbsp; &nbsp;map&#60; pair&#60; int, int &#62;, int &#62; :: iterator it = values.find( make_pair( sum, digits ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( it != values.end() )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return it -&#62; second;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// заданную сумму удалось набрать</div><div class="code_line">&nbsp;&nbsp; &nbsp;// необработанные оставшиеся разряды будут равны 0, т к их добавление не влияет на набранную сумму</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( sum == 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// все разряды обработаны, но заданную сумму, так и не удалось набрать</div><div class="code_line">&nbsp;&nbsp; &nbsp;// вроде бы избыточно, т к перебор цифр сделан сверх оптимально, что ВСЕГДА приводит к набору нужной суммы</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( digits == 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int res = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for( int i = max( 0, sum - 9*( digits - 1 ) ); i &#60; min( 10, sum + 1 ); i++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;res += F159( sum - i, digits - 1 );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// добавляем новый набор в таблицу мемоизации</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pair&#60; int, int &#62; new_value = make_pair( sum, digits );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;values[ new_value ] = res;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return res;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;setlocale( LC_ALL, &quot;Russian&quot; );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; F159( 159, 19 );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cin.get();</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
есть у меня подозрение, что вот этот блок проверки digits == 0 избыточен, т к перебор допустимых цифр настолько оптимален ( идеально просто ), что ВСЕГДА заданную сумму можно набрать<br>
<br>
ответ выдается моментально и равен <span class="tag-color tag-color-named" data-value="red" style="color: red">86 489 615</span> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-04-12T14:30:00+00:00">12.04.24, 14:30</time></span></span><br>
и в целом все прекрасно  :yes:  работает и теперь почти все основательно понятно, но есть одно маленькое НО - этот код <span class="tag-color tag-color-named" data-value="red" style="color: red"><strong class='tag-b'>НЕ решает</strong></span> поставленную задачу), т к НЕ учитывает ограничение на 2<sup class='tag-sup'>63</sup>...<br>
на данный момент находятся <span class='tag-u'>ВСЕ наборы</span>, состоящие из 19 цифр + их сумма = 159.<br>
<br>
и вот надо тут понять такие моменты:<br>
1. можно ли доработать текущий алгоритм, добавив это ограничение<br>
2. нужен абсолютно НОВЫЙ алго<br>
<br>
и вот сдается мне, что здесь вариант №2  :huh:, потому что алгоритм ни коим образом не учитывает местоположение анализируемого разряда<br>
<br>
A + B = C<br>
C - все множество подходящих наборов из 19 цифр и суммой = 159<br>
A - кол-во наборов, таких же как С, но &lt; 2<sup class='tag-sup'>63</sup><br>
B - --&#62; &gt;= 2<sup class='tag-sup'>63</sup><br>
а толку - никак ведь не поможет<br>
<br>
нужна какая-то сравнительная таблица поразрядных подстановок или что-то в таком духе...<br>
<br>
====================================<br>
<br>
кстати, а тот код на Питоне ведь каким-то чудом это ограничение учитывает, хм...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902995</guid>
        <pubDate>Fri, 12 Apr 2024 12:48:47 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902995</link>
        <description><![CDATA[MBo: &gt;алгоритму все равно, каким образом &quot;анализируем&quot; разрядную сетку числа: от старшего к младшему разряду или наоборот.<br>Да<br><br>&gt;summ - отвечает за ту сумму, которую нужно получить, используя dig разрядов<br>Да<br><br>&gt;отрицательное значение. Из этого следует, что левая граница текущего разряда начинается от 0?<br>Верно, поэтому для обрезки отрицательных  стоит max(0, summ - 9*(dig-1))<br><br>&gt;нужно подставлять НУЛИ<br>нет, не нужно. Это условие работает, когда остаток summ становится меньше 9. Тогда нет смысла проверять все цифры до девятки<br><br>&gt;12345 312XX - этот набор уже НЕ будет считаться, т к будет дан запрос в хранилище, мол надо получить сумму = 9, используя 2 разряда, а такой расчет уже был для варианта 12345 и сразу вычисления заканчиваются и запрос отвечает, да, такую сумму можно получить и в качестве ответа вернет число, равное кол-ву всех возможных комбинаций, которыми можно получить эту сумму<br><br>Совершенно верно<br><br>&gt;мемоизация <br><br>Вроде всё правильно]]></description>
        <author>MBo</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902990</guid>
        <pubDate>Fri, 12 Apr 2024 11:27:39 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902990</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>MBo</strong>, спс, стало понятнее, но есть еще ряд моментов. Про них тоже прошу пояснить.<br>
<br>
момент №1.<br>
как я понимаю, алгоритму все равно, каким образом &quot;анализируем&quot; разрядную сетку числа: от старшего к младшему разряду или наоборот.<br>
<br>
============================================<br>
<br>
момент №2.<br>
про заголовок функции cnt159<br>
ее прототип: int cnt159( int summ, int dig )<br>
summ - отвечает за ту сумму, которую нужно получить, используя dig разрядов<br>
например: cnt159( 39, 4 ) говорит, что нужно собрать сумму, равную 39, используя РОВНО 4ре СВОБОДНЫХ ( еще не обработанных ) разряда <br>
<br>
на старте она вызывается с аргументами ( 159, 19 ), т к нужно в итоге получить 159, используя 19 разрядов<br>
<br>
============================================<br>
<br>
момент №3.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=444425&view=findpost&p=3902978'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2024-04-12T09:45:01+00:00">12.04.24, 09:45</time></span><div class='quote '>Код на каждом уровне рекурсии перебирает очередную цифру в диапазоне возможных значений - цифра не может быть меньше, чем остаток минус все девятки на других местах, и не больше остатка. Например, если оставшаяся сумма 20, а цифр осталось 3, то 0 и 1 не может быть первой цифрой, и перебираем от 2 до 9</div></div><br>
интуитивно я понимаю о чем речь, это примерно о тех коэффициентах k0, k1, ..., k8, k9, о которых писал выше, просто у тебя этот перебор сделан сверх оптимально. Как бы это не анализ этих коэффициентов, а выбор диапазона допустимого значения разряда - это я вроде понимаю.<br>
<br>
т е происходит анализ ТЕКУЩЕГО разряда и делается попытка найти диапазон его значений.<br>
например, осталось 5 разрядов и нужна сумма = 40: XXXXX<br>
что мы делаем: заполняем 9ками все разряды кроме текущего X9999 и находим разность 40 - 9*4 = 4<br>
получается, что минимум текущий разряд должен быть 4кой. Это понятно.<br>
а, если то же самое, но сумма = 30 --&#62; X9999 --&#62; 30 - 9*4 = -6 - получилось отрицательное значение. <br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">Из этого следует, что левая граница текущего разряда начинается от 0?</span><br>
<br>
по правой границе.<br>
как я понял, нужно подставлять НУЛИ<br>
5 разрядов и нужна сумма = 40 --&#62; X0000 ---&#62; 40 - 0 = 40 &gt; 9, следовательно, правая граница = 9<br>
<br>
другой пример. Сумму нужно набрать 7, используя 2 разряда<br>
X0 --&#62; 7 - 0 = 7 &lt;= 9, следовательно, правая граница = 7.<br>
<br>
вот этот набор правил, позволит однозначно определить границы значений текущего разряда? - но как-то ведь у тебя проще сделано + писал про остаток от деления<br>
<br>
===============================================<br>
<br>
момент №4. про мемоизацию<br>
рассмотрим упрощенный пример, пусть нужна сумма = 15 и дано 5ть разрядов<br>
рассмотрим 2 набора:<br>
12345<br>
312XX - этот набор уже НЕ будет считаться, т к будет дан запрос в хранилище, мол надо получить сумму = 9, используя 2 разряда, а такой расчет уже был для варианта 12345 и сразу вычисления заканчиваются и запрос отвечает, да, такую сумму можно получить и в качестве ответа вернет число, равное кол-ву всех возможных комбинаций, которыми можно получить эту сумму<br>
<br>
мемоизация начинает работать только тогда, когда будет получен хотя бы 1 подходящий набор для суммы = 159 из 19 разрядов. Для этих целей map будет заюзан, как ты писал выше. А обращаться к этой таблице мемоизации нужно в начале каждого вызова рекурсивной функции.<br>
Мемоизация будет работать только тогда, когда в таблице будет совпадение по нужной сумме и кол-ву еще незанятных разрядов. Местоположение разрядов не играет никакой роли. По сути, ведь, мемоизация дает колоссальную оптимизацию при пересчете хвостовых перестановок разрядов...наверное) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-04-12T11:36:14+00:00">12.04.24, 11:36</time></span></span><br>
про силу мемоизации добавлю еще, что, условно, если для случая<br>
12XXXXXXXX... получилось 256К подходящих вариантов, то<br>
при анализе 21XXXXXXXX... сразу запрос к таблице и ответ вернется 256К за О(1) ( или может не О(1), а чуть побольше, в зависимости от архитектуры map ) без всяких пересчетов]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902978</guid>
        <pubDate>Fri, 12 Apr 2024 09:45:01 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902978</link>
        <description><![CDATA[MBo: Код на каждом уровне рекурсии перебирает очередную цифру в диапазоне возможных значений - цифра не может быть меньше, чем остаток минус все девятки на других местах, и не больше остатка. Например, если оставшаяся сумма 20, а цифр осталось 3, то 0 и 1 не может быть первой цифрой, и перебираем от 2 до 9<br><br>range(0, 15) равносилен в С++ for( int i = 0; i &lt; 15; i++) (конец диапазона не входит).<br><br>lru_cache - это мемоизация. Скажем так - если функция с такими аргументами уже вызывалась, то результат возвращается из таблицы. Иначе результат считается и заносится в таблицу типа map.insert(std::pair&lt;int,int&gt;(summ,dig));<br><br>Однако, когда писал, я  не придумал, как легко учесть ограничение.]]></description>
        <author>MBo</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902976</guid>
        <pubDate>Fri, 12 Apr 2024 09:22:06 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902976</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>MBo</strong>, спс, конечно, за код, но для начала нужно понять АЛГОРИТМ. Я попробую его восстановить через код, но тут всяких моментов полно:<br>
1. я так понимаю, что range - аналог for, т е запись for i in range( 0, 15 ) равносильна в С++ for( int i = 0; i &lt;= 15; i++ )<br>
2. и этот момент важнее в разы. В каком формате хранит lru_cache, в какой момент вызывается, т к явно в функции нигде вызова этого нету + какие результаты вычислений хранит. Это какая-то форма мемоизации или нет - непонятно все это...<br>
<br>
а лучше всего пояснить алго на пальцах]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902972</guid>
        <pubDate>Fri, 12 Apr 2024 09:02:32 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902972</link>
        <description><![CDATA[MBo: <strong class='tag-b'>FasterHarder</strong><br>
<br>
Вот я делал что на Python, но без ограничения - может быть, легче читать. <br>
<br>
lru_cache складывает уже посчитанные результаты в таблицу, и использует  без перевычисления, можно map использовать для этого.<br>
Считает мгновенно и код выше, и этот.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import functools</div><div class="code_line">@functools.lru_cache(9999)</div><div class="code_line">def cnt159(summ, dig):</div><div class="code_line">&nbsp;&nbsp; &nbsp;if summ == 0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;if dig == 0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;res = 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i in range(max(0, summ - 9*(dig-1)), min(10, summ+1)):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;res += cnt159(summ - i, dig - 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;return res</div><div class="code_line">&nbsp;</div><div class="code_line">print(cnt159(159, 19))</div></ol></div></div></div></div>]]></description>
        <author>MBo</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902964</guid>
        <pubDate>Fri, 12 Apr 2024 07:39:58 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902964</link>
        <description><![CDATA[FasterHarder: <strong class='tag-b'>Mikle</strong>, если готов, то, давай поразбираемся...<br>
<br>
<strong class='tag-b'>опр. Искомое число - число, состоящее из 19 разрядов, сумма цифр которого = 159.</strong><br>
<br>
перед нами такое уравнение:<br>
k0*0 + k1*1 + ... * k8*8 + k9*9 = 159, где<br>
k0, k1, ..., k8, k9 - коэффициенты, выражающие количество цифр ( соот-но 0, 1, ..., 8, 9 ( в искомом числе.<br>
Т к искомое число состоит из 19 разрядов, то покамест эти коэффициенты лежат на отрезке [ 0; 19 ]. То есть, если делать полный перебор, то это 20^10 вариантов, что &quot;рядом&quot; с 2^63...<br>
<br>
Докажем, что искомое число ДОЛЖНО иметь минимум 7 разрядов, равных 9.<br>
Если предположить, что искомое число содержит 6 разрядов, равных 9, то в этом случае максимальная сумма цифр будет: 6 * 9 + 13 * 8 = 158, а должно быть НЕ МЕНЬШЕ 159. Доказано.<br>
<br>
Кстати, по формуле сочетаний, получается 50 388 различных наборов чисел, состоящих из 7 девяток. Много времени потратил на развитие этой идеи, но там образуются дубликаты после перестановок, которые вообще не понимаю, как победить, поэтому отказался от этой идеи...<br>
<br>
На данный момент известно, что по крайней мере k9 = [ 7; 19 ]. Можно еще правую границу сузить, т к 9 * 18 = 162 &gt; 159, поэтому k9 = [ 7; 17 ].<br>
<br>
Если забить число одними 9ками, то сумма цифр будет 9 * 19 = 171. А надо, чтобы было 159. И тут есть 2 подхода ( не уверен, что они равносильные ).<br>
1 подход: получать всеми возможными способами сумму 159<br>
2 подход: инвертировать логику и получать всеми возможными способами сумму 12. 159 = 171 - 12. В этой логике 9 как бы 0, 8 как бы 1 и т.д. Узнав, сколько существует способов получить сумму 12, автоматически скажет, сколько существует способов получить сумму 159.<br>
Что проще для анализа: пытаться получить сумму, равную 159 или сумму равную 12? Вроде как визуально даже проще 12.<br>
<br>
Запишем:<br>
k0*0 + k1*1 + ... * k8*8 + k9*9 = 12, а также известно, что k0 = [ 7; 17 ]<br>
<br>
Что по k1, который отвечает за кол-во единиц ( де-юре за за количество 8рок )?<br>
k1 * 1 &lt;= 12 ---&#62; k1 &lt;= 12<br>
<br>
По k2: k2 * 2 &lt;= 12 ---&#62; k2 &lt;= 6<br>
k3: k3 * 3 &lt;= 12 ---&#62; k3 &lt;= 4<br>
k4: k4 * 4 &lt;= 12 ---&#62; k4 &lt;= 3<br>
k5: k5 * 5 &lt;= 12 ---&#62; k5 &lt;= 2<br>
k6: &lt;= 2<br>
k7, k8, k9 &lt;= 1<br>
<br>
В итоге ограничение по коэффициентам такие:<br>
[ 7; 17 ] - 11 наборов<br>
[ 0; 12 ] - 13 наборов<br>
[ 0; 6 ] - 7 наборов<br>
[ 0; 4 ] - 5 наборов<br>
[ 0; 3 ] - 4 набора<br>
[ 0; 2 ] - 3 набора<br>
[ 0; 2 ] - 3 набора<br>
остальные [ 0; 1] - 2 набора<br>
<br>
Чтобы сделать перебор всего этого дела потребуется итераций:<br>
11 * 13 * 7 * 5 * 4 * 3 * 3 * 2 * 2 * 2 = 1 441 400 - это ВЕРХНЯЯ ОЦЕНКА всей этой шняги...Перебор этих итераций ( пустых ) комп сделает ну где-то около секунды. Понятно, что ВНУТРИ каждой итерации должна быть проверка на сумму 159 + кол-во разрядов. Когда набор найден, включаются перестановки с повторениями, вроде бы...<br>
<br>
Ты упомянул про треугольник Паскаля, я так понимаю, что это больше для полноты картины и можно без него ведь.<br>
<br>
==================================<br>
<br>
понятно, что еще есть проблема с самим число 2^63, т к, например, число, начинающееся с 99...уже недопустимо и как победить это - вообще не представляется возможным, т к все считается в итоге на комбинаторике, а ей по барабану на это ограничение...ужс<br>
<br>
в целом нелегко как-то, учитывая, что это задача уровня ЕГЭ ( ну, понятно, какого-то завышенного уровня сложности ) и задачи из этой категории, как правило, решаются за 1 мин, бывает и за 15 сек) мдя... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-04-12T07:57:22+00:00">12.04.24, 07:57</time></span></span><br>
кстати, есть ведь готовый код на ЯП ПАЙТОН ( который я знаю ровно на 0.0 ):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">from functools import *</div><div class="code_line"> </div><div class="code_line"># граничное значение</div><div class="code_line">a = list(map(int, str(2**63-1)))</div><div class="code_line"> </div><div class="code_line">@cache</div><div class="code_line">def f(s, l, fl):</div><div class="code_line">&nbsp;&nbsp; &nbsp;# если последовательность нужной длины, проверяем, что сумма нам подходит,</div><div class="code_line">&nbsp;&nbsp; &nbsp;# и выходим из рекурсии.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if l == 0: return s == 159</div><div class="code_line"> </div><div class="code_line">&nbsp;&nbsp; &nbsp;# проверяем ограниченные подпоследовательности большей длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;return sum(f(s+x, l-1, fl and (x == a[-l])) for x in range([10, a[-l]+1][fl]))</div><div class="code_line"> </div><div class="code_line"># ответ - количество ограниченных последовательностей необходимой длины</div><div class="code_line">print(f(0, len(a), 1))</div></ol></div></div></div></div><br>
<br>
и тут настолько все лаконично, охренеть...но я так понимаю, что здесь юзается какой-то готовый шаблон библиотечный, наверное, вот этот range<br>
но все равно, как-то все просто получается...кстати еще непонятно, сколько времени это чешуя вся работает на питоне...<br>
<br>
на С++ ведь не получится таким же объемом кода сделать)) или...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902790</guid>
        <pubDate>Tue, 09 Apr 2024 10:59:55 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902790</link>
        <description><![CDATA[Mikle: Без всяких int64 расчётов.<br>
Заводим массив на 10 элементов. В ячейки записываются кол-ва цифр, равных номеру в массиве.<br>
В начале все элементы = 0.<br>
Рекурсивно обходим массив с 0-го элемента, поочерёдно записывая туда числа от 0 до 19.<br>
Переходя к следующему элементу, проверяем, что сумма значений элементов не превысила 19, а сумма произведений значений элементов на их номера не превысила 159. При превышении или достижении 10-го (несуществующего) элемента проверяем, что сумма значений элементов равна 19, а сумма произведений значений элементов на их номера равна 159. Если да, то мы нашли очередной вариант кол-ва разных цифр в искомом большом числе.<br>
Для найденных вариантов простой расчёт, допустим, мы нашли, что в числе 8 девяток, 10 восьмёрок и 1 семёрка:<br>
8*9+10*8+1*7=159<br>
8+10+1=19<br>
10 восьмёрок в 19-разрядном числе можно разместить 92378 способами, 92378 - это 10-й элемент 19-й строки треугольника Паскаля.<br>
Далее в оставшихся 9 разрядах одну семёрку можно разместить 9-ю способами (1-й элемент 9-й строки треугольника Паскаля). Девятки мы не считаем, девятки - это &quot;все остальные цифры&quot;.<br>
Итого 92378*9 = 831402 - такое кол-во чисел, в составе цифр которых 8 девяток, 10 восьмёрок и 1 семёрка.<br>
Находим так для всех остальных составов, суммируем.<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">Но это без учёта лимита 2^63&#33;</span>]]></description>
        <author>Mikle</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902783</guid>
        <pubDate>Tue, 09 Apr 2024 08:27:06 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902783</link>
        <description><![CDATA[macomics: Комбинаторикой можно было бы обойтись. Но придется еще как-то учесть лимит чисел (9223372036854775807). Подозреваю, что тогда формула для вычисления количества перестановок получится очень большой.<br><br>20 знаков я посчитал для unsigned int64 (18446`74407`37095`51615 = 20 знаков)]]></description>
        <author>macomics</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902771</guid>
        <pubDate>Tue, 09 Apr 2024 07:41:20 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902771</link>
        <description><![CDATA[FasterHarder: Абсолютно верно подмечено, что здесь &quot;зашифрован&quot; алгоритм нахождения суммы цифр заданного числа. Поправка небольшая: там 19 цифр, а не 20.<br>
<br>
Вот наименьшее и наибольшее подходящее значение:<br>
0_699_999_999_999_999_999 - MIN<br>
9_159_999_999_999_999_999 - MAX ( вроде б&#33; )<br>
<br>
Получается, что нужно 159 единиц распихать по разрядам всеми возможными способами, чтобы полученное значение принадлежало [ MIN; MAX ]. Это back-tracking нужен или нет, хм...<br>
<br>
Если все 19 разрядов принять за 9, то будет 19 * 9 = 171. То нужно получить все возможные комбинации, когда вычитается 12 единиц.<br>
<br>
Насчет решения влоб) Я имел ввиду, что задачки из этой категории на рекурсию кодируются дословно, как в условии. Теперь я понял, что здесь надо действовать от обратного.<br>
<br>
Еще по структурам данных: тут достаточно с числом работать или придется массив из 19 элементов заводить, хм...<br>
<br>
Еще такой момент: в задачах такого типа иногда вообще код не пишется, а все доказывается через математические рассуждения. Где-то ариф.прогрессия, где-то факториальная зависимость и т.п. Может и здесь БЕЗ КОДА все можно сделать?)) Тут оч. сильно &quot;попахивает&quot; комбинаторикой, перестановками и пр. ( об этом написал macomics еще в посте №4 )<br>
<br>
зы: в целом должно быть просто, а ведь непросто здесь как-то все...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902752</guid>
        <pubDate>Tue, 09 Apr 2024 04:36:14 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902752</link>
        <description><![CDATA[macomics: Получается первое число удовлетворяющее условию это 699999999999999999. Сумма его цифр как раз равна 159. А дальше надо проверять не все (т.к. их осталось очень много 0699999999999999999 .. 9223372036854775807), а следовать выше описанному правилу.<br>
<br>
Получается надо 12 ноликов разложить по 19 <s class='tag-s'>коробкам</s>цифрам, но в каждой помещается не более 9. Еще и лимит есть, который не позволяет просто посчитать количество таких перестановок.]]></description>
        <author>macomics</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902750</guid>
        <pubDate>Tue, 09 Apr 2024 03:59:17 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902750</link>
        <description><![CDATA[macomics: <s class='tag-s'>(n &gt; 1600) разделив на 10 получите явно значение большее 159 после суммирования. (1500 &gt; n) разделив на 10 и прибавив остаток от деления (т.к. в остатке будет значение не больше 10) тоже не могут дать значение равное 159. Поэтому проверять в цикле 2<sup class='tag-sup'>63</sup> не нужно.</s><br>
<br>
Рекурсию я и не заметил. Надо подумать о пределах. Хотя уже и так очевидно, то F(n % 10) эквивалентно n % 10 по условию функции.<br>
<br>
ADD: по сути получается, что тут сумма всех цифр числа должна быть равна 159. 2<sup class='tag-sup'>64</sup> число содержит не более 20 цифр. Но, если к одной цифре прибавить 1, то от другой эту единицу надо отнять, чтобы не нарушалась сумма.]]></description>
        <author>macomics</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902749</guid>
        <pubDate>Tue, 09 Apr 2024 03:23:38 +0000</pubDate>
        <title>Задачка из ЕГЭ, время работы которой оптимизировать бы как-то...</title>
        <link>https://forum.sources.ru/index.php?showtopic=444425&amp;view=findpost&amp;p=3902749</link>
        <description><![CDATA[FasterHarder: Всем хай&#33; Сходу к делу&#33;<br>
<br>
Попалась на просторах сети такая задача.<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">Алгоритм вычисления значения функции F(n), где n  — целое число, задан следующими соотношениями:<br>
F(n) = n, если n &lt; 10;<br>
F(n) = F(n mod 10) + F(n div 10), если n &gt;= 10.<br>
Определите количество значений n, меньших 2<sup class='tag-sup'>63</sup>, для которых F(n) = 159.</span><br>
<br>
Если решать в лоб, то все тривиально, конечно. Кстати, вот это число 2<sup class='tag-sup'>63</sup>, это ведь секстиллионы, септиллионы всякие и т.п. В С++ тип данных __int64 вроде покрывает это значение, поэтому в коде везде этот тип данных воткнул, не думая долго.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;limits&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std;</div><div class="code_line">&nbsp;</div><div class="code_line">__int64 F( __int64 n )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( n &#60; 10 )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return n;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return F( n % 10 ) + F( n / 10 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main( void )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;__int64 k = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for( __int64 n = 11; n &#60;= LLONG_MAX; n++ ) &nbsp;// LLONG_MAX - это и есть ( 2^63 - 1 )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( F( n ) == 159 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; k;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cin.get();</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Понятно, что программа умерла при запуске. Проверил, примерно за 1сек 1млн значений перебирает. А в диапазоне этих значений больше миллиардов. Причем, чем больше число, тем больше времени требуется на его обработку/проверку.<br>
<br>
Вопрос: можно ли как-то брут-форс оптимизировать? Но не в 5 раз, т к глобально это все равно по времени работы будет &quot;вечность&quot;. Тут нужна оптимизация в миллиард раз хотя бы, хотя этого тоже маловато будет.<br>
<br>
==============================<br>
С др.стороны программа вроде корректная ( если нет опечаток каких-нибудь ) и требований по времени выполнения нет. Но мне просто любопытен сам факт оптимизации всего этого дела...]]></description>
        <author>FasterHarder</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	