<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:sharpc</id>
  <title>Магия слов и чисел</title>
  <subtitle>или добро пожаловать на пик Разума</subtitle>
  <author>
    <name>sharpc</name>
  </author>
  <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom"/>
  <updated>2010-01-04T23:11:06Z</updated>
  <lj:journal userid="9812774" username="sharpc" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://sharpc.livejournal.com/data/atom" title="Магия слов и чисел"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:56928</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/56928.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=56928"/>
    <title>Ненависти псто: гуглозавр</title>
    <published>2010-01-04T23:03:41Z</published>
    <updated>2010-01-04T23:11:06Z</updated>
    <category term="software"/>
    <category term="интернет"/>
    <lj:music>Ashlee Simpson — [Autobiography #06] Better Off</lj:music>
    <content type="html">Меня удивляют люди, которые искренне полагают, что Google — корпорация добра и технологический лидер. Застрявший в середине 90-х дизайн с тошнотворными голубыми плашками и омерзительным Arial, &lt;a href="http://ru.wikipedia.org/wiki/Google_Web_Toolkit"&gt;криворукие библиотечки&lt;/a&gt;, какие-то жалкие потуги заменить годами оттачивавшиеся офисные инструменты наколенными поделками, &lt;a href="http://habrahabr.ru/blogs/google/77941/"&gt;неприкрытое и нахальное любопытство&lt;/a&gt; к конфиденциальным данным пользователей, тяжеловесный и совершенно неюзабельный &lt;a href="http://ru.wikipedia.org/wiki/Gmail"&gt;GMail&lt;/a&gt;, так и не взлетевшие &lt;a href="http://ru.wikipedia.org/wiki/Google_Wave"&gt;Wave&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/Knol"&gt;Knol&lt;/a&gt;, чуркоподобный переводчик — все это уже заставляет говорить как минимум о том, что Гугл это динозавр. Единственный нормальный проект Google, не являющийся тупой выдачей чужой информации — это &lt;a href="http://ru.wikipedia.org/wiki/V8_(%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript)"&gt;V8&lt;/a&gt;, разработанный &lt;a href="http://en.wikipedia.org/wiki/Lars_Bak_(computer_programmer)"&gt;Ларсом Баком&lt;/a&gt; из датского филиала.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Не менее удивительно и то, что многие люди считают гуглопоисковик лучшим, хотя даже в поиске точной цитаты &lt;a href="http://yandex.ua/yandsearch?text=%D0%B2%D1%81%D0%B5+%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D1%8B%D0%B5+%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%B8+%D0%BA%D0%B0%D0%BF%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D0%B7%D0%BC%D0%B5+%D0%BD%D0%B0%D0%B6%D0%B8%D1%82%D1%8B+%D0%BD%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%BC+%D0%B8+%D0%B4%D0%B0%D0%B6%D0%B5+%D0%BC%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC+%D0%BF%D1%83%D1%82%D0%B5%D0%BC&amp;amp;tld=ua&amp;amp;lr=11464"&gt;«все крупные состояния при капитализме нажиты нечестным и даже магическим путем»&lt;/a&gt; он оказывается совершенно &lt;a href="http://www.google.com.ua/search?ie=UTF-8&amp;amp;hl=ru&amp;amp;q=%D0%B2%D1%81%D0%B5%20%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D1%8B%D0%B5%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%B0%D0%BF%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D0%B7%D0%BC%D0%B5%20%D0%BD%D0%B0%D0%B6%D0%B8%D1%82%D1%8B%20%D0%BD%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%BC%20%D0%B8%20%D0%B4%D0%B0%D0%B6%D0%B5%20%D0%BC%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%20%D0%BF%D1%83%D1%82%D0%B5%D0%BC"&gt;несостоятельным&lt;/a&gt;. Чего уж говорить о морфологиях и синонимах! Так же эпично Google продувает &lt;a href="http://nigma.ru/"&gt;Нигме&lt;/a&gt; и &lt;a href="http://www.wolframalpha.com/"&gt;WolframAlpha&lt;/a&gt; соревнование за непосредственную выдачу ответа на введенный вопрос (т.н. колдунщик или oneliner).&lt;br /&gt;&lt;br /&gt;Кажется парадоксальным и распределение ролей корпорации добра и империи зла в знаменитом споре Google vs. Microsoft.&lt;br /&gt;&lt;br /&gt;Microsoft выпускает &lt;a href="http://ru.wikipedia.org/wiki/Visual_Studio"&gt;лучшую IDE&lt;/a&gt; и лучший компилятор C++, &lt;a href="http://habrahabr.ru/blogs/programming/55272/"&gt;поддерживает&lt;/a&gt; исследования в области языков программирования, &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;стандартизует&lt;/a&gt; .NET, &lt;a href="http://office.microsoft.com/ru-ru/products/HA102058151049.aspx"&gt;открывает&lt;/a&gt; форматы файлов Office. Google &lt;a href="http://code.google.com/hosting/"&gt;бездарно клонирует&lt;/a&gt; &lt;a href="http://sourceforge.net/"&gt;Sourceforge&lt;/a&gt;, выплевывает &lt;a href="http://ru.wikipedia.org/wiki/Go"&gt;невнятный и недоработанный Go&lt;/a&gt; и совершенно неудобоваримый &lt;a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml"&gt;C++ style guide&lt;/a&gt;, в котором мощнейший язык современности урезан до уровня Java.&lt;br /&gt;&lt;br /&gt;Microsoft выводит свой &lt;a href="http://research.microsoft.com/en-us/groups/vision/"&gt;R&amp;D-отдел&lt;/a&gt; в лидеры в области computer vision, Google сокращает количество финалистов &lt;a href="http://code.google.com/intl/ru/codejam/"&gt;Code Jam&lt;/a&gt; в 20 раз.&lt;br /&gt;&lt;br /&gt;Microsoft заботится об удобстве программиста, разрабатывает красивый и удобный &lt;a href="http://ru.wikipedia.org/wiki/Ribbon"&gt;интерфейс&lt;/a&gt;, выпускает стабильные операционные системы (Vista это тот же Windows ME, проигнорируем ее). Google &lt;a href="http://net.compulenta.ru/368880/"&gt;шпионит&lt;/a&gt; за пользователями, рассказывая, что им нечего скрывать, &lt;a href="http://ru.wikipedia.org/wiki/Chrome_OS"&gt;добавляет&lt;/a&gt; Chrome в Ubuntu и называет это новой революционной ОС, усугубляет неприемлемость и тормознутость (зачем им понадобился свой браузер, ага) своих интерфейсов.&lt;br /&gt;&lt;br /&gt;Microsoft &lt;a href="http://ru.wikipedia.org/wiki/Microsoft_Security_Essentials"&gt;прилагает&lt;/a&gt; титанические усилия, чтобы обеспечить безопасность пользователям, и стеснительно сообщает пользователям нелицензионных версий, что их, видимо, обманули. Google отказывается обналичивать чеки AdSense каждому второму, сует рекламу повсюду с назойливостью Mirabilis, полностью игнорирует загаживание интернета попапами и &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BB%D0%BE%D0%B3"&gt;сплогами&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Так что ждем &lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%BC%D0%B8%D1%80%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%BE%D0%B7%D0%B0%D0%B2%D1%80%D0%BE%D0%B2#.D0.92.D0.BD.D0.B5.D0.B7.D0.B5.D0.BC.D0.BD.D1.8B.D0.B5"&gt;метеорит&lt;/a&gt; на разжиревшие гугловские датацентры, который разнесет в щепки устоявшееся мнение, что самая большая компания в интернете — флагман прогресса, а вовсе не неповоротливый бездушный монстр, давно утративший способность делать что-то хорошее и качественное.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:56797</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/56797.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=56797"/>
    <title>С Новым Годом-2010!</title>
    <published>2009-12-31T07:51:44Z</published>
    <updated>2009-12-31T07:51:44Z</updated>
    <category term="дыбр"/>
    <lj:music>Dark Princess — [Жестокая Игра #05] Когда проснулось небо</lj:music>
    <content type="html">Стандартный новогодний отчет: события, фильмы, контесты, альбомы, книги, открытия, новости IT, составившие портрет этого года.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Побывал в Киевском планетарии.&lt;/b&gt; 21-му веку нужны новые планетарии, с БШ :)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Пост &lt;a href="http://sharpc.livejournal.com/41356.html"&gt;«Нужны ли миру гуманитарии»&lt;/a&gt;.&lt;/b&gt; Славный троллинг вышел в топ Яндекса и доставил массу вкусной копипасты.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Пост &lt;a href="http://sharpc.livejournal.com/42128.html"&gt;«Большой монарх совершает прорыв»&lt;/a&gt;&lt;/b&gt;, надеюсь, положил начало традиции сочинять что-то доброе и забавное на 1 апреля.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://sharpc.livejournal.com/46955.html"&gt;Попробовал&lt;/a&gt; на зуб ЗНО&lt;/b&gt; и изложил впечатления, резюмировав их во фразе «индекс лояльности».&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://sharpc.livejournal.com/51337.html"&gt;Поучаствовал&lt;/a&gt; в Южной экспедиции&lt;/b&gt; и собираюсь повторить подобное мероприятие в 2010-м году.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Эксперименты с шаблонами дошли до реализации тьюринг-полной &lt;a href="http://sharpc.livejournal.com/53394.html"&gt;Brainfuck-машины&lt;/a&gt;.&lt;/b&gt; Выше только Абрахамс-Гуртовой и звезды :)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Попробовал себя в роли преподавателя.&lt;/b&gt; Оцениваю скорее как фэйл, но буду продолжать, и конспект лекций выложу.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Лучшие фильмы 2009-го:&lt;/b&gt; День рождения Алисы, Ангелы и демоны, Гарри Поттер и принц-полукровка.&lt;br /&gt;&lt;b&gt;Лучшие контесты года:&lt;/b&gt; RuCTF и TCO.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Лучшие альбомы года:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Delain — April Rain&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lunatica — New shores&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Epica — Design Your Universe&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Eternal Tears of Sorrow — Children of the Dark Waters&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Открытия года:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;сериал&lt;/b&gt; «Теория Большого Взрыва»;&lt;br /&gt;&lt;b&gt;музыкальные коллективы&lt;/b&gt; Draconian, Lacrimosa, Markize, Evenfall, Poets of the Fall;&lt;br /&gt;&lt;b&gt;игры&lt;/b&gt; World of Warcraft, King's Bounty, Braid;&lt;br /&gt;&lt;b&gt;книги&lt;/b&gt; Ник Горькавый «Астровитянка-2», Андрей Александреску «Современное проектирование на C++», Валерий Босс «Интуиция и математика».&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Самые интересные вещи года в IT:&lt;/b&gt; &lt;a href="http://verypositive.com/files/d2.pdf"&gt;D 2.0&lt;/a&gt;, &lt;a href="http://www.boostcon.com/site-media/var/sphene/sphwiki/attachment/2009/05/08/iterators-must-go.pdf"&gt;Iterators must go&lt;/a&gt;, &lt;a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n3000.pdf"&gt;несостоявшийся C++09&lt;/a&gt;, &lt;a href="http://www.php.net/archive/2009.php#id2009-06-30-1"&gt;PHP 5.3&lt;/a&gt;, &lt;a href="http://habrahabr.ru/blogs/javascript/66455/"&gt;v8cgi&lt;/a&gt;, &lt;a href="http://www.udk.com/"&gt;бесплатная лицензия на Unreal Engine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Всех с Новым Годом! :)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:56560</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/56560.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=56560"/>
    <title>Дети, не учите PHP, часть 3</title>
    <published>2009-12-30T09:26:05Z</published>
    <updated>2009-12-30T09:26:05Z</updated>
    <category term="программирование"/>
    <lj:music>Poets of the Fall — [Carnival of Rust #09] All the Way 4 You</lj:music>
    <content type="html">Вчера моя программа на скорости 10.4 МБ/с завершила индексацию и хэширование моей скромной 828-гигабайтовой библиотечки, выплюнула 106-метровый csv-файл, 916 тысяч записей из которого были еще через пару минут добавлены в БД MySQL. Попутно с помощью MD5 оказалось, что 410 гигабайт у меня и лучшей библиотеки сканов &lt;a href="http://gen.lib.rus.ec/"&gt;Genesis&lt;/a&gt; общие. И немедленно встал вопрос об апдейте веб-оболочки для этого добра: просмотр папок, аннотаций, свойств файла, поиск дубликатов и прочая БШ-функциональность.&lt;br /&gt;&lt;br /&gt;Наибольшее неудобство при просмотре таблицы с деревом файлов возникает при необходимости узнать путь к какому-нибудь файлу. Вариантов здесь два: либо использовать несколько последовательных селектов для выборки родителей, либо поместить их все в хранимую процедуру и вызывать ее. «Хранимые процедуры — это круто» — подумал я.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://webiteam.ru/2009/04/mysql-procedure-and-function/"&gt;Статья&lt;/a&gt; по хранимым процедурам нагуглилась довольно легко, более того, в ней даже была моя задача. Тут следует заметить, что в ХП сформировать на выдачу массив, судя по всему, нельзя, так что решалась она через хак: в цикле создавалась строка с идами записей, разделенными запятой, после чего формировался SQL-запрос, в котором происходила выборка с условием IN (...).&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw1"&gt;CREATE PROCEDURE&lt;/span&gt; `path` (_id &lt;span class="kw2"&gt;INT&lt;/span&gt;) &lt;span class="kw1"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;SET&lt;/span&gt; @items := _id;&lt;br /&gt;&amp;nbsp; &amp;nbsp; while _id &amp;gt; &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="kw1"&gt;DO&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;SELECT&lt;/span&gt; `id_parent` &lt;span class="kw1"&gt;INTO&lt;/span&gt; _id &lt;span class="kw1"&gt;FROM&lt;/span&gt; `files_20091228_1111` &lt;span class="kw1"&gt;WHERE&lt;/span&gt; `id` = _id;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;SET&lt;/span&gt; @items := &lt;span class="kw1"&gt;CONCAT&lt;/span&gt;(@items, &lt;span class="st0"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;, _id);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;END&lt;/span&gt; while;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;SET&lt;/span&gt; @sql := &lt;span class="kw1"&gt;CONCAT&lt;/span&gt;(&lt;span class="st0"&gt;&amp;quot;select * from `files_20091228_1111` where `id` in (&amp;quot;&lt;/span&gt;, @items, &lt;span class="st0"&gt;&amp;quot;) order by field(`id`, &amp;quot;&lt;/span&gt;, @items, &lt;span class="st0"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; prepare stmt &lt;span class="kw1"&gt;FROM&lt;/span&gt; @sql;&lt;br /&gt;&amp;nbsp; &amp;nbsp; execute stmt;&lt;br /&gt;&lt;span class="kw1"&gt;END&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Код довольно прост, разве что можно отметить order by field, который сортирует выдачу так, чтобы порядок следования идов и записей был одинаков.&lt;br /&gt;&lt;br /&gt;Процедура работает, выдает то, что положено. Попробуем сравнить быстродействие с последовательными селектами.&lt;br /&gt;&lt;br /&gt;ВНЕЗАПНО на mysql_fetch_assoc в другом конце кода вылезает ошибка "Commands out of sync; you can't run this command now". Гуглим и обнаруживаем, что это может быть в Си-программах, которые вызывают функции MySQL не в той последовательности. Чувствуем, как в воздухе разливается запах &lt;strike&gt;гноя&lt;/strike&gt; багов — ведь в PHP о верности последовательности вызовов заботится интерпретатор, оборачивающий данные в PHP-массивы.&lt;br /&gt;&lt;br /&gt;Продолжаем гуглить, включив ключевые слова «хранимые процедуры» и «PHP». Оказывается, что эта бага происходит оттого, что mysql_query с вызовом хранимой процедуры, если та возвращает таблицу с данными, как у нас, возвращает не один результат, а целых два: первый хранит саму таблицу, а второй индикатор успешности выполнения процедуры. MySQL API оказывается не в силах это осознать, и дальнейшие вызовы по отношению к результатам запросов валятся.&lt;br /&gt;&lt;br /&gt;Стоит заметить, что почти все PHP-приложения используют именно MySQL API, а не невнятный MySQLi, в пользу этого свидетельствует хотя бы число гуглохитов: 1580к за mysql_connect против 37к за mysqli_connect. Однако воркараунды (использование mysqli_next_result) приводятся только для MySQLi. Читаем мануал: в PHP MySQL API никакого mysql_next_result нет и в помине.&lt;br /&gt;&lt;br /&gt;Завершает феерию &lt;a href="http://bugs.php.net/bug.php?id=39727"&gt;баг #39727&lt;/a&gt; в багтрекере PHP, в котором жалуются на эту самую проблему. Багрепортер вопрошает: «а где же mysql_next_result, чтожеделатьтоаааа??». Ответ на это удручает неимоверно — Wont fix, use mysqli.&lt;br /&gt;&lt;br /&gt;А вот &lt;a href="http://www.artfulsoftware.com/infotree/tip.php?id=777"&gt;тут&lt;/a&gt; предложили магически передавать в mysql_connect 5-м параметром магическую константу CLIENT_MULTI_STATEMENTS = 65536. Авторы утверждают, что тогда один вызов ХП на коннект работать будет, однако у меня этот совет не заработал.&lt;br /&gt;&lt;br /&gt;Итак, пришлось переписать все на богомерзком MySQLi. Запускаем бенчмарк (100 рандомных записей), дабы узнать, наконец, насколько значительное преимущество даст нам вышеупомянутая битва с багами:&lt;br /&gt;&lt;br /&gt;хранимые процедуры — &lt;b&gt;1.707&lt;/b&gt; секунд;&lt;br /&gt;пачка селектов — &lt;b&gt;0.234&lt;/b&gt; секунд.&lt;br /&gt;&lt;br /&gt;Занавес.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:56242</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/56242.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=56242"/>
    <title>Поздравляю всех с моим 23-летием</title>
    <published>2009-12-26T22:05:36Z</published>
    <updated>2009-12-26T22:05:36Z</updated>
    <category term="дыбр"/>
    <lj:music>Riverside — [Voices In My Head #01] Us</lj:music>
    <content type="html">Сабж.&lt;br /&gt;&lt;br /&gt;Попутно к «юбилею» подходит мой файл с заметками: 3991 заметка общим размером 4868213 байт. В нем встречается 102 тысячи разных слов, причем 42 тысячи чаще одного раза. Самое распространенное осмысленное слово — boost (более 1000 упоминаний) :) Причина этого в том, что я скопировал сообщение об ошибке, вызванной одним лишним символом в коде с использованием boost.bimap. Два самых распространенных русских существительных в моих заметках состоят из 5 букв и сообщают, чего я больше всего боюсь и что я больше всего люблю — ожидаю предположений о том, что бы это могло быть, в комментах :)&lt;br /&gt;&lt;br /&gt;А еще на момент написания этого поста в моей уютной жэжэшечке 2971 комментарий, то есть она тоже подходит к своему юбилею и, надеюсь, с вашей помощью достигнет его еще в &lt;strike&gt;этой пятилетке&lt;/strike&gt; этом году.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:56012</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/56012.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=56012"/>
    <title>Ненависти псто: топсидеры</title>
    <published>2009-12-23T19:38:16Z</published>
    <updated>2009-12-23T19:38:16Z</updated>
    <category term="интернет"/>
    <lj:music>Riverside — [Voices In My Head #02] Acronym Love</lj:music>
    <content type="html">А вот интересно, вспоминают ли топсидеры, что при раздаче каждого гигабайта, если на раздаче кроме них есть несчастные люди, у которых круглосуточная активная раздача затруднена провайдером (например, как у меня), они отнимают у этих несчастных людей возможность скачать 1 / 0.30 ~ 3.33 гигабайта?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:55614</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/55614.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=55614"/>
    <title>А ТЫ помнишь векторный анализ?</title>
    <published>2009-12-22T20:36:11Z</published>
    <updated>2009-12-23T14:30:11Z</updated>
    <category term="задачи"/>
    <category term="математика"/>
    <lj:music>Akashic — [A Brand New Day #01] Revealed Secrets</lj:music>
    <content type="html">Сегодня я наткнулся на забавную головоломку.&lt;br /&gt;&lt;br /&gt;Согласно &lt;a href="http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0#.D0.A2.D0.BE.D0.B6.D0.B4.D0.B5.D1.81.D1.82.D0.B2.D0.B0_.D1.81_.D0.B4.D0.B2.D1.83.D0.BC.D1.8F_.28.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B_.D0.B2.D1.82.D0.BE.D1.80.D0.BE.D0.B3.D0.BE_.D0.BF.D0.BE.D1.80.D1.8F.D0.B4.D0.BA.D0.B0.29"&gt;формуле в Википедии&lt;/a&gt;,&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Cnabla%20%20%5Ctimes%20%5Cnabla%20%20%5Ctimes%20%7B%5Cbf%7BA%7D%7D%20=%20%5Cnabla%20%5Cleft(%20%7B%5Cnabla%20%20%5Ccdot%20%7B%5Cbf%7BA%7D%7D%7D%20%5Cright)%20-%20%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\nabla  \times \nabla  \times {\bf{A}} = \nabla \left( {\nabla  \cdot {\bf{A}}} \right) - \nabla ^2 {\bf{A}}" style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;br /&gt;Попробуем это проверить.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cnabla%20%20%5Ctimes%20%7B%5Cbf%7BA%7D%7D%20=%20%5Cleft%7C%20%7B%5Cbegin%7Barray%7D%7B*%7B20%7Dc%7D%0D%0A%20%20%20%7B%5Cbf%7Bi%7D%7D%20%26%20%7B%5Cbf%7Bj%7D%7D%20%26%20%7B%5Cbf%7Bk%7D%7D%20%20%5C%5C%0D%0A%20%20%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%7D%20%20%5C%5C%0D%0A%20%20%20%7B%7B%5Cbf%7BA%7D%7D_x%20%7D%20%26%20%7B%7B%5Cbf%7BA%7D%7D_y%20%7D%20%26%20%7B%7B%5Cbf%7BA%7D%7D_z%20%7D%20%20%5C%5C%0D%0A%5Cend%7Barray%7D%7D%20%5Cright%7C%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%5Cright)%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\begin{array}{l} \nabla  \times {\bf{A}} = \left| {\begin{array}{*{20}c}   {\bf{i}} &amp;amp; {\bf{j}} &amp;amp; {\bf{k}}  \\   {\frac{{\partial }}{{\partial x}}} &amp;amp; {\frac{{\partial }}{{\partial y}}} &amp;amp; {\frac{{\partial }}{{\partial z}}}  \\   {{\bf{A}}_x } &amp;amp; {{\bf{A}}_y } &amp;amp; {{\bf{A}}_z }  \\\end{array}} \right| =  \\   = \left( {\frac{{\partial {\bf{A}}_z }}{{\partial y}} - \frac{{\partial {\bf{A}}_y }}{{\partial z}};\frac{{\partial {\bf{A}}_x }}{{\partial z}} - \frac{{\partial {\bf{A}}_z }}{{\partial x}};\frac{{\partial {\bf{A}}_y }}{{\partial x}} - \frac{{\partial {\bf{A}}_x }}{{\partial y}}} \right) \\  \end{array}" style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;br /&gt;Это хорошо известная и простая формула для ротора. Возьмем от нее еще один ротор:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Cnabla%20%20%5Ctimes%20%5Cnabla%20%20%5Ctimes%20%7B%5Cbf%7BA%7D%7D%20=%20%5Cleft%7C%20%7B%5Cbegin%7Barray%7D%7B*%7B20%7Dc%7D%0D%0A%20%20%20%7B%5Cbf%7Bi%7D%7D%20%26%20%7B%5Cbf%7Bj%7D%7D%20%26%20%7B%5Cbf%7Bk%7D%7D%20%20%5C%5C%0D%0A%20%20%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%7D%20%20%5C%5C%0D%0A%20%20%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%7D%20%26%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%20%5C%5C%0D%0A%5Cend%7Barray%7D%7D%20%5Cright%7C%20=%20&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\nabla  \times \nabla  \times {\bf{A}} = \left| {\begin{array}{*{20}c}   {\bf{i}} &amp;amp; {\bf{j}} &amp;amp; {\bf{k}}  \\   {\frac{{\partial }}{{\partial x}}} &amp;amp; {\frac{{\partial }}{{\partial y}}} &amp;amp; {\frac{{\partial }}{{\partial z}}}  \\   {\frac{{\partial {\bf{A}}_z }}{{\partial y}} - \frac{{\partial {\bf{A}}_y }}{{\partial z}}} &amp;amp; {\frac{{\partial {\bf{A}}_x }}{{\partial z}} - \frac{{\partial {\bf{A}}_z }}{{\partial x}}} &amp;amp; {\frac{{\partial {\bf{A}}_y }}{{\partial x}} - \frac{{\partial {\bf{A}}_x }}{{\partial y}}}  \\\end{array}} \right| = " style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%20=%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20y%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%5Cright)%20-%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20z%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%7D%20%5Cright);%20%5C%5C%20%0D%0A%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20z%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%7D%20%5Cright)%20-%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20x%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%7D%20%5Cright);%20%5C%5C%20%0D%0A%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20x%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%7D%7D%7D%20%5Cright)%20-%20%5Cfrac%7B%5Cpartial%20%7D%7B%7B%5Cpartial%20y%7D%7D%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%7D%7D%7D%20%5Cright)%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D%20%5Cright)%20=%20&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt=" = \left( \begin{array}{l} \frac{\partial }{{\partial y}}\left( {\frac{{\partial {\bf{A}}_y }}{{\partial x}} - \frac{{\partial {\bf{A}}_x }}{{\partial y}}} \right) - \frac{\partial }{{\partial z}}\left( {\frac{{\partial {\bf{A}}_x }}{{\partial z}} - \frac{{\partial {\bf{A}}_z }}{{\partial x}}} \right); \\  \frac{\partial }{{\partial z}}\left( {\frac{{\partial {\bf{A}}_z }}{{\partial y}} - \frac{{\partial {\bf{A}}_y }}{{\partial z}}} \right) - \frac{\partial }{{\partial x}}\left( {\frac{{\partial {\bf{A}}_y }}{{\partial x}} - \frac{{\partial {\bf{A}}_x }}{{\partial y}}} \right); \\  \frac{\partial }{{\partial x}}\left( {\frac{{\partial {\bf{A}}_x }}{{\partial z}} - \frac{{\partial {\bf{A}}_z }}{{\partial x}}} \right) - \frac{\partial }{{\partial y}}\left( {\frac{{\partial {\bf{A}}_z }}{{\partial y}} - \frac{{\partial {\bf{A}}_y }}{{\partial z}}} \right) \\  \end{array} \right) = " style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%20=%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D;%20%5C%5C%20%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D;%20%5C%5C%20%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20-%20%5Cfrac%7B%7B%5Cpartial%20%5E2%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D%20%5Cright)&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt=" = \left( \begin{array}{l} \frac{{\partial ^2 {\bf{A}}_y }}{{\partial x\partial y}} - \frac{{\partial ^2 {\bf{A}}_x }}{{\partial y^2 }} - \frac{{\partial ^2 {\bf{A}}_x }}{{\partial z^2 }} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial x\partial z}}; \\  \frac{{\partial ^2 {\bf{A}}_z }}{{\partial y\partial z}} - \frac{{\partial ^2 {\bf{A}}_y }}{{\partial z^2 }} - \frac{{\partial ^2 {\bf{A}}_y }}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial y}}; \\  \frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial z}} - \frac{{\partial ^2 {\bf{A}}_z }}{{\partial x^2 }} - \frac{{\partial ^2 {\bf{A}}_z }}{{\partial y^2 }} - \frac{{\partial ^2 {\bf{A}}_y }}{{\partial y\partial z}} \\  \end{array} \right)" style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;br /&gt;Как видим, получился довольно страшненький вектор, в каждой компоненте которого 4 слагаемых. Теперь посчитаем его по формуле из Википедии:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cnabla%20%5Cleft(%20%7B%5Cnabla%20%20%5Ccdot%20%7B%5Cbf%7BA%7D%7D%7D%20%5Cright)%20-%20%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D;%20%5C%5C%20%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D;%20%5C%5C%20%0D%0A%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D%20%5Cright)%20-%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%7D%20%5Cright)%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20y%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5Cpartial%20z%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5Cpartial%20z%7D%7D%7D%20%5Cright)%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\begin{array}{l} \nabla \left( {\nabla  \cdot {\bf{A}}} \right) - \nabla ^2 {\bf{A}} =  \\   = \left( \begin{array}{l} \frac{{\partial ^2 {\bf{A}}_x }}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial x\partial y}} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial x\partial z}}; \\  \frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial y}} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial y^2 }} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial y\partial z}}; \\  \frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial z}} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial y\partial z}} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial z^2 }} \\  \end{array} \right) - \left( {\frac{{\partial ^2 {\bf{A}}_x }}{{\partial x^2 }};\frac{{\partial ^2 {\bf{A}}_y }}{{\partial y^2 }};\frac{{\partial ^2 {\bf{A}}_z }}{{\partial z^2 }}} \right) =  \\   = \left( {\frac{{\partial ^2 {\bf{A}}_y }}{{\partial x\partial y}} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial x\partial z}};\frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial y}} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial y\partial z}};\frac{{\partial ^2 {\bf{A}}_x }}{{\partial x\partial z}} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial y\partial z}}} \right) \\  \end{array}" style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;br /&gt;В каждой компоненте сокращается повторная частная производная и остается... 2 слагаемых!&lt;br /&gt;&lt;br /&gt;Внимание, вопрос, уважаемые знатоки. Куда девались еще 2 слагаемых во второй формуле, либо откуда взялись 2 слагаемых в первой? Сразу отмечу, что они ненулевые.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Что это я юзал? Сервис &lt;a href="http://l.wordpress.com/latex.php?latex=x&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1"&gt;http://l.wordpress.com/latex.php?latex=x&amp;bg=ffffff&amp;fg=000000&amp;s=1&lt;/a&gt; и самописный скриптик для быстрой генерации img-тэга.&lt;br /&gt;Что это я слушаю? Замечательный melodic progressive metal.&lt;br /&gt;Где я взял такое курево? Там его все равно уже нет :)&lt;br /&gt;Есть ли что-нибудь попроще? В &lt;a href="http://sharpc.livejournal.com/55441.html"&gt;предыдущем посте&lt;/a&gt; уже 2 подсказки, пора бы и правильный ответ писать :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решено:&lt;/b&gt; &lt;span class='ljuser ljuser-name_the_aaa13' lj:user='the_aaa13' style='white-space: nowrap;'&gt;&lt;a href='http://the-aaa13.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://the-aaa13.livejournal.com/'&gt;&lt;b&gt;the_aaa13&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; первым заметил, что лапласиан указан неверно. Хитрость состоит в том, что лапласиан обычно действует на скалярное поле и возвращает скалярное, а здесь он действует на векторное:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Cbegin%7Barray%7D%7Bl%7D%0D%0A%20%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D%20=%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%7D%20%5Cright)%20%2B%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%7D%20%5Cright)%20%2B%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%7D%20%5Cright)%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%7B%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D;%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20x%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20y%5E2%20%7D%7D%20%2B%20%5Cfrac%7B%7B%5Cpartial%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%7D%7B%7B%5Cpartial%20z%5E2%20%7D%7D%7D%20%5Cright)%20=%20%20%5C%5C%20%0D%0A%20%20=%20%5Cleft(%20%7B%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D_x%20;%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D_y%20;%5Cnabla%20%5E2%20%7B%5Cbf%7BA%7D%7D_z%20%7D%20%5Cright)%20%5C%5C%20%0D%0A%20%5Cend%7Barray%7D&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=0" alt="\begin{array}{l} \nabla ^2 {\bf{A}} = \frac{{\partial ^2 {\bf{A}}}}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}}}{{\partial y^2 }} + \frac{{\partial ^2 {\bf{A}}}}{{\partial y^2 }} =  \\   = \left( {\frac{{\partial ^2 {\bf{A}}_x }}{{\partial x^2 }};\frac{{\partial ^2 {\bf{A}}_y }}{{\partial x^2 }};\frac{{\partial ^2 {\bf{A}}_z }}{{\partial x^2 }}} \right) + \left( {\frac{{\partial ^2 {\bf{A}}_x }}{{\partial y^2 }};\frac{{\partial ^2 {\bf{A}}_y }}{{\partial y^2 }};\frac{{\partial ^2 {\bf{A}}_z }}{{\partial y^2 }}} \right) + \left( {\frac{{\partial ^2 {\bf{A}}_x }}{{\partial z^2 }};\frac{{\partial ^2 {\bf{A}}_y }}{{\partial z^2 }};\frac{{\partial ^2 {\bf{A}}_z }}{{\partial z^2 }}} \right) =  \\   = \left( {\frac{{\partial ^2 {\bf{A}}_x }}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}_x }}{{\partial y^2 }} + \frac{{\partial ^2 {\bf{A}}_x }}{{\partial z^2 }};\frac{{\partial ^2 {\bf{A}}_y }}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial y^2 }} + \frac{{\partial ^2 {\bf{A}}_y }}{{\partial z^2 }};\frac{{\partial ^2 {\bf{A}}_z }}{{\partial x^2 }} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial y^2 }} + \frac{{\partial ^2 {\bf{A}}_z }}{{\partial z^2 }}} \right) =  \\   = \left( {\nabla ^2 {\bf{A}}_x ;\nabla ^2 {\bf{A}}_y ;\nabla ^2 {\bf{A}}_z } \right) \\  \end{array}" style="vertical-align: middle" /&gt;&lt;br /&gt;&lt;br /&gt;Как видим, здесь появляются по 2 потерянных слагаемых в каждой компоненте во второй формуле.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:55441</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/55441.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=55441"/>
    <title>Призываю телепатов</title>
    <published>2009-12-19T20:21:54Z</published>
    <updated>2009-12-27T20:19:23Z</updated>
    <category term="головоломки"/>
    <lj:music>Poets Of The Fall — [Revolution Roulette #09] Passion Colors Everything</lj:music>
    <content type="html">После длительного перерыва в пост вновь призываются телепаты. Хотя никому не составит труда узнать число 1.718281828459045..., для того, чтобы определить, откуда взялось число 0.6751984379111143419..., непременно понадобится помощь телепата.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Подсказка №1:&lt;/b&gt; В этом ЖЖ уже была угадайка, в которой фигурировали два иррациональных числа.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Подсказка №2:&lt;/b&gt; Константы Эйлера-Маскерони, Мертенса и Бруна убедительно показывают, что надо выкинуть из ряда, чтобы он начал, наконец, сходиться.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решено:&lt;/b&gt; Почти сразу после написания поста &lt;span class='ljuser ljuser-name_mehas' lj:user='mehas' style='white-space: nowrap;'&gt;&lt;a href='http://mehas.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://mehas.livejournal.com/'&gt;&lt;b&gt;mehas&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; сообщил в аську, что это число можно найти, как последовательность его цифр, в справочнике Слоана под номером &lt;a href="http://www.research.att.com/~njas/sequences/A100124"&gt;A100124&lt;/a&gt;. Он решил дать другим помучаться, и мучения эти завершились верным ответом &lt;span class='ljuser ljuser-name_shuffle_c' lj:user='shuffle_c' style='white-space: nowrap;'&gt;&lt;a href='http://shuffle-c.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://shuffle-c.livejournal.com/'&gt;&lt;b&gt;shuffle_c&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Действительно, в этом ЖЖ уже была угадайка, в которой фигурировали две иррациональные суммы рядов. Очевидно, что &lt;img src="http://l.wordpress.com/latex.php?latex=e%20-%201%20=%20%5Csum%5Climits%5E%7B%5Cinfty%7D_%7Bk=1%7D%7B%5Cfrac%7B1%7D%7Bk!%7D%7D&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="e - 1 = \sum\limits^{\infty}_{k=1}{\frac{1}{k!}}" style="vertical-align: middle" /&gt;. Вторая подсказка относится к сходимости следующих рядов:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Clim%5Climits_%7Bn%20%5Cto%20%5Cinfty%7D%7B%20%5Cleft(%20%5Csum%5Climits%5En_%7Bk=1%7D%7B%5Cfrac%7B1%7D%7Bk%7D%7D%20-%20%5Cln%7Bn%7D%20%5Cright)%7D%20=%20%5Cgamma&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\lim\limits_{n \to \infty}{ \left( \sum\limits^n_{k=1}{\frac{1}{k}} - \ln{n} \right)} = \gamma" style="vertical-align: middle" /&gt; (константа Эйлера-Маскерони, сумма по натуральным числам)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Clim%5Climits_%7Bn%20%5Cto%20%5Cinfty%7D%7B%20%5Cleft(%20%5Csum%5Climits_%7Bp%20%5Cle%20n%7D%7B%5Cfrac%7B1%7D%7Bp%7D%7D%20-%20%5Cln%5Cln%7Bn%7D%20%5Cright)%7D%20=%20M&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\lim\limits_{n \to \infty}{ \left( \sum\limits_{p \le n}{\frac{1}{p}} - \ln\ln{n} \right)} = M" style="vertical-align: middle" /&gt; (константа Мертенса, сумма по простым числам)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Clim%5Climits_%7Bn%20%5Cto%20%5Cinfty%7D%7B%20%5Cleft(%20%5Csum%5Climits_%7Bt%20%5Cle%20n%7D%7B%5Cfrac%7B1%7D%7Bt%7D%7D%20%5Cright)%7D%20=%20B_2&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\lim\limits_{n \to \infty}{ \left( \sum\limits_{t \le n}{\frac{1}{t}} \right)} = B_2" style="vertical-align: middle" /&gt; (константа Бруна, сумма по простым близнецам)&lt;br /&gt;&lt;br /&gt;Выкидываем из ряда для e&amp;minus;1 все составные числа и получаем&lt;br /&gt;&lt;br /&gt;&lt;img src="http://l.wordpress.com/latex.php?latex=%5Csum%5Climits_%7Bp%7D%7B%5Cfrac%7B1%7D%7Bp!%7D%7D%20=%200.67519843791111...&amp;amp;bg=ffffff&amp;amp;fg=000000&amp;amp;s=1" alt="\sum\limits_{p}{\frac{1}{p!}} = 0.67519843791111..." style="vertical-align: middle" /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:55079</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/55079.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=55079"/>
    <title>SRM 454</title>
    <published>2009-12-07T00:30:58Z</published>
    <updated>2009-12-07T00:30:58Z</updated>
    <category term="олимпиады"/>
    <lj:music>Evenfall — [Cumbersome #04] Entre Dos Tierras</lj:music>
    <content type="html">Автор сета &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=8433628"&gt;&lt;font color="#EE0000"&gt;&lt;b&gt;Gluk&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;. Контест, к сожалению, был почти целиком технический. Боги Топкодера, судя по всему, разгневались на меня, иначе чем объяснить тот факт, что последние 3 контеста у меня падали 250? Падение продолжается с одним перерывом аж с апреля, так что я уже примеряю зеленую форму лузера (привет, &lt;span class='ljuser ljuser-name_shuffle_c' lj:user='shuffle_c' style='white-space: nowrap;'&gt;&lt;a href='http://shuffle-c.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://shuffle-c.livejournal.com/'&gt;&lt;b&gt;shuffle_c&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; :)).&lt;br /&gt;&lt;br /&gt;&amp;darr;1282&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10705&amp;amp;rd=13908"&gt;&lt;b&gt;div2 250&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;Найти наименьшее число в [A;B], которое по сумме цифр ближе всего к C. A,B,C до 1ккк, но B&amp;minus;A до 100к.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ограничение на длину интервала позволяет нам просто перебрать все его числа.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MinimalDifference {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; digitsum(&lt;span class="kw4"&gt;int&lt;/span&gt; n)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; res = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;while&lt;/span&gt; (n) { res += n % &lt;span class="nu0"&gt;10&lt;/span&gt;; n /= &lt;span class="nu0"&gt;10&lt;/span&gt;; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; findNumber(&lt;span class="kw4"&gt;int&lt;/span&gt; A, &lt;span class="kw4"&gt;int&lt;/span&gt; B, &lt;span class="kw4"&gt;int&lt;/span&gt; C) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; res = A, mres = numeric_limits&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;::max();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = A; i &amp;lt;= B; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (abs(digitsum(i) - digitsum(C)) &amp;lt; mres) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mres = abs(digitsum(i) - digitsum(C));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = i;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10708&amp;amp;rd=13908"&gt;&lt;b&gt;div2 500&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;Найти, за какое минимальное число перестановок строк и/или столбцов можно (если можно) сделать в таблице букв n&amp;times;n заданное слово из n разных символов по горизонтали или вертикали (n до 50).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что выстроить слово можно только тогда, когда в какой-то строке или столбце есть все нужные буквы. Переберем все такие строки и столбцы, посчитав для каждой количество нужных обменов непосредственным моделированием, и найдем минимум.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; WordsGame {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; swaps(string a, string b)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; res = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;size_t&lt;/span&gt; n = a.length();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; n; ++i) &lt;span class="kw1"&gt;if&lt;/span&gt; (a[i] != b[i]) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; swap(a[i], a[a.find(b[i])]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ++res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; minimumSwaps(vector &amp;lt;string&amp;gt; grid, string word) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;size_t&lt;/span&gt; n = word.length();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; res = numeric_limits&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;::max();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; n; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;bool&lt;/span&gt; has = &lt;span class="kw2"&gt;true&lt;/span&gt;; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; n; ++j) &lt;span class="kw1"&gt;if&lt;/span&gt; (grid[i].find(word[j]) == string::npos) has = &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (has) res = min(res, swaps(grid[i], word));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string vword; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; n; ++j) vword.push_back(grid[j][i]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; has = &lt;span class="kw2"&gt;true&lt;/span&gt;; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; n; ++j) &lt;span class="kw1"&gt;if&lt;/span&gt; (vword.find(word[j]) == string::npos) has = &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (has) res = min(res, swaps(vword, word));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res == numeric_limits&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;::max() ? &lt;span class="nu0"&gt;-1&lt;/span&gt; : res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10706&amp;amp;rd=13908"&gt;&lt;b&gt;div1 250&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;Левоассоциативная операция ^^ над двумя числами преобразует их соответствующие цифры в (a&lt;sub&gt;i&lt;/sub&gt; ^ b&lt;sub&gt;i&lt;/sub&gt;) % 10. Найти N ^^ (N&amp;minus;1) ^^ ... ^^ 1. N до 1кк.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ограничение на N позволяет вычислить ответ циклом от N до 1. До сих пор удивляюсь, что заставило меня написать цикл в другую сторону :)&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; DoubleXor {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; calculate(&lt;span class="kw4"&gt;int&lt;/span&gt; N) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; p10[] = {&lt;span class="nu0"&gt;1&lt;/span&gt;, &lt;span class="nu0"&gt;10&lt;/span&gt;, &lt;span class="nu0"&gt;100&lt;/span&gt;, &lt;span class="nu0"&gt;1000&lt;/span&gt;, &lt;span class="nu0"&gt;10000&lt;/span&gt;, &lt;span class="nu0"&gt;100000&lt;/span&gt;, &lt;span class="nu0"&gt;1000000&lt;/span&gt;, &lt;span class="nu0"&gt;10000000&lt;/span&gt;};&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; res = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = N; i &amp;gt;= &lt;span class="nu0"&gt;1&lt;/span&gt;; --i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; nres = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; z = &lt;span class="nu0"&gt;0&lt;/span&gt;; z &amp;lt; &lt;span class="nu0"&gt;8&lt;/span&gt;; ++z) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nres += ((((i / p10[z]) % &lt;span class="nu0"&gt;10&lt;/span&gt;) ^ ((res / p10[z]) % &lt;span class="nu0"&gt;10&lt;/span&gt;)) % &lt;span class="nu0"&gt;10&lt;/span&gt;) * p10[z];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = nres;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10709&amp;amp;rd=13908"&gt;&lt;b&gt;div2 1000 &amp; div1 500&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;Спичками выложено число N до 10&lt;sup&gt;18&lt;/sup&gt;&amp;minus;1 (как обычно, цифра до 7 спичек, только к единице снизу добавлена спичка). Сколько разных чисел (включая начальное) можно получить, переместив для получения каждого не более K спичек?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Представим, что у нас есть большая кучка спичек, а все операции сводятся к перемещению спички из числа в кучку и наоборот. Тогда одному ходу по условию будет соответствовать, например, только перемещение спички из кучки в число. Получим ДП [число обработанных цифр][количество оставшихся перемещений][количество спичек в кучке] = количество различных чисел. Тогда ответом будет являться сумма элементов массива, соответствующих всем обработанным цифрам и начальному количеству спичек в кучке (в реализации &amp;mdash; 128). Легко посчитать, захардкодив внешний вид цифр, сколько спичек нужно снять, а сколько положить, чтобы из любой цифры получить любую. После этого будем пробовать сменить каждую цифру на любую.&lt;br /&gt;&lt;br /&gt;Эту задачу я дебажил почти полчаса, ни на секунду не предположив, что неправильно считаю (логарифмом) количество цифр в N :)&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="height: 400px; overflow: auto;"&gt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; dp[&lt;span class="nu0"&gt;20&lt;/span&gt;][&lt;span class="nu0"&gt;128&lt;/span&gt;][&lt;span class="nu0"&gt;256&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; NumbersAndMatches {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; differentNumbers(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; N, &lt;span class="kw4"&gt;int&lt;/span&gt; K) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; p10[&lt;span class="nu0"&gt;19&lt;/span&gt;] = {&lt;span class="nu0"&gt;1&lt;/span&gt;}; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;1&lt;/span&gt;; i &amp;lt; &lt;span class="nu0"&gt;19&lt;/span&gt;; ++i) p10[i] = p10[i&lt;span class="nu0"&gt;-1&lt;/span&gt;] * &lt;span class="nu0"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memset(dp, &lt;span class="nu0"&gt;0&lt;/span&gt;, sizeof(dp));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dp[&lt;span class="nu0"&gt;0&lt;/span&gt;][K][&lt;span class="nu0"&gt;128&lt;/span&gt;] = &lt;span class="nu0"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; D = &lt;span class="nu0"&gt;0&lt;/span&gt;; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; n = N; n; ++D) n /= &lt;span class="nu0"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; digit[][&lt;span class="nu0"&gt;7&lt;/span&gt;] = {&amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;},&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;,&lt;span class="nu0"&gt;1&lt;/span&gt;}};&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; add[&lt;span class="nu0"&gt;10&lt;/span&gt;][&lt;span class="nu0"&gt;10&lt;/span&gt;], del[&lt;span class="nu0"&gt;10&lt;/span&gt;][&lt;span class="nu0"&gt;10&lt;/span&gt;];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memset(add, &lt;span class="nu0"&gt;0&lt;/span&gt;, sizeof(add));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memset(del, &lt;span class="nu0"&gt;0&lt;/span&gt;, sizeof(del));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span class="nu0"&gt;10&lt;/span&gt;; ++i) &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; &lt;span class="nu0"&gt;10&lt;/span&gt;; ++j) &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; k = &lt;span class="nu0"&gt;0&lt;/span&gt;; k &amp;lt; &lt;span class="nu0"&gt;7&lt;/span&gt;; ++k) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; add[i][j] += digit[j][k] &amp;gt; digit[i][k];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; del[i][j] += digit[j][k] &amp;lt; digit[i][k];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; D; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt;= K; ++j) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; k = &lt;span class="nu0"&gt;-126&lt;/span&gt;; k &amp;lt;= &lt;span class="nu0"&gt;126&lt;/span&gt;; ++k) &lt;span class="kw1"&gt;if&lt;/span&gt; (dp[i][j][k + &lt;span class="nu0"&gt;128&lt;/span&gt;]) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; odigit = (N / p10[D-i&lt;span class="nu0"&gt;-1&lt;/span&gt;]) % &lt;span class="nu0"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; ndigit = &lt;span class="nu0"&gt;0&lt;/span&gt;; ndigit &amp;lt; &lt;span class="nu0"&gt;10&lt;/span&gt;; ++ndigit) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (add[odigit][ndigit] &amp;lt;= j) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dp[i&lt;span class="nu0"&gt;+1&lt;/span&gt;]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [j - add[odigit][ndigit]]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [k + add[odigit][ndigit] - del[odigit][ndigit] + &lt;span class="nu0"&gt;128&lt;/span&gt;] += dp[i][j][k + &lt;span class="nu0"&gt;128&lt;/span&gt;];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; result = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt;= K; ++j) result += dp[D][j][&lt;span class="nu0"&gt;128&lt;/span&gt;];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10710&amp;amp;rd=13908"&gt;&lt;b&gt;div1 1000&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;Таблица заполнена числами таким образом:&lt;br /&gt;&lt;table frame="box"&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;&lt;i&gt;Для каждого числа X в таблице S(X) равно сумме всех элементов таблицы не ниже и не правее X. Дано число N (до 10ккк), найти сумму S(X) для всех X не ниже и не правее N по модулю 10&lt;sup&gt;9&lt;/sup&gt;+7.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;В итоговую сумму каждое X входит столько раз, сколько чисел внутри прямоугольника, образованного X и N. Если попытаться сложить эти произведения напрямую, получим TL, т.к. 10ккк это много. Но можно посчитать сумму сразу для какого-то участка таблицы, где числа идут в одном направлении &amp;mdash; например, len чисел, начиная с числа from, которое находится на расстоянии dl строк и dc колонок от N, и которые идут в направлении (dirl; dirc). Сумма по номеру числа в последовательности от получившегося полинома 2-й степени легко складывается в закрытую формулу, вычисляемую за O(1), либо в Maple, либо почленно с использованием &lt;a href="http://en.wikipedia.org/wiki/Faulhaber%27s_formula"&gt;известных формул&lt;/a&gt; для сумм квадратов и первых степеней. После этого следует просуммировать каждый отрезок (их O(sqrt(N))) внутри квадрата, а потом дополнить до прямоугольника. Если внимательно проделать эту механическую работу, не забыв везде понатыкать long long и модуль, можно получить AC. На контесте с этим справились только 3 человека.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="height: 400px; overflow: auto;"&gt;&lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; M = &lt;span class="nu0"&gt;1000000007&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MegaSum {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; pair&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt; loc(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; N)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; layer = (&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;) sqrt((&lt;span class="kw4"&gt;double&lt;/span&gt;) (N - &lt;span class="nu0"&gt;1&lt;/span&gt;));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; d = N - layer * layer;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (layer % &lt;span class="nu0"&gt;2&lt;/span&gt; == &lt;span class="nu0"&gt;1&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; d &amp;lt;= layer ? make_pair(d - &lt;span class="nu0"&gt;1&lt;/span&gt;, layer) : make_pair(layer, layer - (d - layer - &lt;span class="nu0"&gt;1&lt;/span&gt;));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; d &amp;lt;= layer ? make_pair(layer, d - &lt;span class="nu0"&gt;1&lt;/span&gt;) : make_pair(layer - (d - layer - &lt;span class="nu0"&gt;1&lt;/span&gt;), layer);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; sumn2(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; n) { &lt;span class="kw1"&gt;return&lt;/span&gt; (&lt;span class="nu0"&gt;2&lt;/span&gt;*n*n*n&lt;span class="nu0"&gt;+3&lt;/span&gt;*n*n+n) / &lt;span class="nu0"&gt;6&lt;/span&gt; % M; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; sumn(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; n) { &lt;span class="kw1"&gt;return&lt;/span&gt; (n*n+n) / &lt;span class="nu0"&gt;2&lt;/span&gt; % M; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; sum(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; from, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; len, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; dl, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; dc, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; dirl, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; dirc)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ++dl; ++dc;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (dirl) { swap(dl, dc); swap(dirl, dirc); }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; res = (&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;) dl * ((-dirc * sumn2(len - &lt;span class="nu0"&gt;1&lt;/span&gt;) +&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (((-from * dirc + dc) % M) * sumn(len - &lt;span class="nu0"&gt;1&lt;/span&gt;) % M) +&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (from % M) * (dc * len % M)) % M) % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; calculate(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; N)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; res = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pair&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt; ep = loc(N);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;bool&lt;/span&gt; wide = ep.first &amp;lt; ep.second;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; ns = min(ep.first, ep.second) + &lt;span class="nu0"&gt;1&lt;/span&gt;, ms = max(ep.first, ep.second) + &lt;span class="nu0"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; ns; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res += sum(i*i&lt;span class="nu0"&gt;+1&lt;/span&gt;, i&lt;span class="nu0"&gt;+1&lt;/span&gt;, ep.first-(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;0&lt;/span&gt;:i), ep.second-(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?i:&lt;span class="nu0"&gt;0&lt;/span&gt;), i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;1&lt;/span&gt;:&lt;span class="nu0"&gt;0&lt;/span&gt;, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;0&lt;/span&gt;:&lt;span class="nu0"&gt;1&lt;/span&gt;) % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res += sum(i*i+i&lt;span class="nu0"&gt;+2&lt;/span&gt;, i, ep.first-(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?i:i&lt;span class="nu0"&gt;-1&lt;/span&gt;), ep.second-(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?i&lt;span class="nu0"&gt;-1&lt;/span&gt;:i), i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;0&lt;/span&gt;:&lt;span class="nu0"&gt;-1&lt;/span&gt;, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;-1&lt;/span&gt;:&lt;span class="nu0"&gt;0&lt;/span&gt;) % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res %= M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; i = ns; i &amp;lt; ms; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (wide) res += sum(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?i*i&lt;span class="nu0"&gt;+1&lt;/span&gt;:(i&lt;span class="nu0"&gt;+1&lt;/span&gt;)*(i&lt;span class="nu0"&gt;+1&lt;/span&gt;)-ns&lt;span class="nu0"&gt;+1&lt;/span&gt;, ns, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?ns&lt;span class="nu0"&gt;-1&lt;/span&gt;:&lt;span class="nu0"&gt;0&lt;/span&gt;, ms-i&lt;span class="nu0"&gt;-1&lt;/span&gt;, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;1&lt;/span&gt;:&lt;span class="nu0"&gt;-1&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;) % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;res += sum(i%&lt;span class="nu0"&gt;2&lt;/span&gt;?(i&lt;span class="nu0"&gt;+1&lt;/span&gt;)*(i&lt;span class="nu0"&gt;+1&lt;/span&gt;)-ns&lt;span class="nu0"&gt;+1&lt;/span&gt;:i*i&lt;span class="nu0"&gt;+1&lt;/span&gt;, ns, ms-i&lt;span class="nu0"&gt;-1&lt;/span&gt;, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;0&lt;/span&gt;:ns&lt;span class="nu0"&gt;-1&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;, i%&lt;span class="nu0"&gt;2&lt;/span&gt;?&lt;span class="nu0"&gt;-1&lt;/span&gt;:&lt;span class="nu0"&gt;1&lt;/span&gt;) % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res %= M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res % M;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В заключение упомяну об интересном факте: оказывается, вплоть до 1976 года было неизвестно, существуют ли непрерывно &lt;b&gt;изгибающиеся многогранники&lt;/b&gt; без самопересечений. Оказывается, существуют :) Пока не доказано, что минимальным (9 вершин) многогранником с таким свойством является &lt;a href="http://ru.wikipedia.org/wiki/%D0%98%D0%B7%D0%B3%D0%B8%D0%B1%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%BD%D0%B8%D0%BA"&gt;&lt;b&gt;полиэдр Штеффена&lt;/b&gt;&lt;/a&gt;. Вот он &lt;a href="http://www.youtube.com/watch?v=OH2kg8zjcqk"&gt;на видео&lt;/a&gt;. Я склеил его для проверки &amp;mdash; действительно, изгибается :) Самым интересным связанным результатом является &lt;b&gt;теорема Сабитова&lt;/b&gt;, доказанная в 1996, из которой следует верность гипотезы &amp;laquo;кузнечных мехов&amp;raquo; о том, что объем любого изгибающегося многогранника постоянен. Примеры изгибающихся многогранников для пространств с размерностью 5 и выше еще не построены :)&lt;br /&gt;&lt;br /&gt;Попутно отмечу, что мало что может сравниться по омерзительности с подключением &lt;a href="http://gmplib.org/"&gt;&lt;b&gt;GMP&lt;/b&gt;&lt;/a&gt; под виндой, даже если он &lt;a href="http://sourceforge.net/projects/mingw/files/"&gt;уже собран&lt;/a&gt;. Дьявольские байты вызывают Access violation, не имеют .lib-файлов, нормального C++-враппера и всячески демонстрируют си головного мозга у создателей, какбе призывая образ ржавой секиры ужаса в мысли несчастных программистов.&lt;br /&gt;&lt;br /&gt;Ну и запишу-ка я &lt;b&gt;Evenfall&lt;/b&gt; в список открытий этого года, а &lt;b&gt;Eternal Tears Of Sorrow&lt;/b&gt; c альбомом &lt;b&gt;Children Of The Dark Waters&lt;/b&gt; в свой ежегодный топ музыкальных альбомов.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:55024</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/55024.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=55024"/>
    <title>sharpc @ 2009-12-03T19:11:00</title>
    <published>2009-12-03T17:11:59Z</published>
    <updated>2009-12-03T17:11:59Z</updated>
    <content type="html">Электрогитара &lt;b&gt;мурчит&lt;/b&gt; под ласковыми пальцами.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:54777</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/54777.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=54777"/>
    <title>Как решать сложные задачи</title>
    <published>2009-11-28T23:12:20Z</published>
    <updated>2009-11-28T23:12:20Z</updated>
    <category term="юмор"/>
    <lj:music>Epica — [Design Your Universe #05] Our Destiny</lj:music>
    <content type="html">Я придумал метод решения экспоненциально сложных задач (пусть N &amp;mdash; число возможных ответов), ответ к которым просто проверить, для случая, если верна &lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%86%D0%B8%D1%8F"&gt;многомировая интерпретация квантовой механики фон Эверетта&lt;/a&gt; и принцип &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%D0%BE%D0%B5_%D0%B1%D0%B5%D1%81%D1%81%D0%BC%D0%B5%D1%80%D1%82%D0%B8%D0%B5"&gt;квантового бессмертия&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Нужно просто собрать машину, которая гарантированно убивает сидящего внутри человека, если тот отдает ей неправильный ответ на задачу. Человек квантово случайно генерирует ответ (например, с помощью радиоактивного распада) и отдает его машине. В N&amp;minus;1 вселенных машина убивает его, в одной оставшейся наблюдатель выходит из машины с правильным ответом. Согласно принципу квантового бессмертия, с точки зрения самого подопытного наблюдателя это будет выглядеть, будто он решил задачу с первого раза. Точка зрения внешних наблюдателей в большинстве вселенных будет &amp;laquo;вот дурак&amp;raquo;.&lt;br /&gt;&lt;br /&gt;Технически проблема состоит в том, что вероятность отказа машины должна быть меньше 1/N. Но если перед вами когда-нибудь возникнет подобная задача, ответ к которой вам дороже жизни, попробуйте этот метод. P = NP, но только для смельчаков!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:54344</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/54344.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=54344"/>
    <title>SRM 453.5</title>
    <published>2009-11-26T04:46:21Z</published>
    <updated>2009-11-26T04:46:21Z</updated>
    <category term="олимпиады"/>
    <lj:music>Lunatica — [New Shores CD1 #07] The Chosen Ones</lj:music>
    <content type="html">Это первый на моей памяти SRM с дробным номером: возник он ввиду технических проблем с SRM 453. Увы, я его проспал, и, как оказалось в practice room, напрасно &amp;mdash; за 45 минут сдал две задачи, а еще через несколько часов, повтыкав в Петино решение, и 1000 :)&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10461"&gt;div2 250&lt;/a&gt;&lt;/b&gt; (автор &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=11829284"&gt;&lt;font color="#EE0000"&gt;&lt;b&gt;andrewzta&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;)&lt;br /&gt;&lt;i&gt;В векторе строки, в строках слова через пробел. Найти количество разных слов.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Даже не знаю, что бы я делал, если бы в C++ не было istringstream и set :)&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; ToolsBox {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; countTools(vector &amp;lt;string&amp;gt; need) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set&amp;lt;string&amp;gt; tools;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;, len = need.size(); i &amp;lt; len; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; istringstream iss(need[i]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;while&lt;/span&gt; (!iss.&lt;span class="kw2"&gt;eof&lt;/span&gt;()) { string s; iss &amp;gt;&amp;gt; s; tools.insert(s); }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; tools.size();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10451"&gt;div2 500 &amp; div1 250&lt;/a&gt;&lt;/b&gt; (автор &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=7296000"&gt;&lt;font color="#DDCC00"&gt;&lt;b&gt;connect4&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;)&lt;br /&gt;&lt;i&gt;В лабиринте можно прыгать заданными способами. Найти количество прыжков до самой &amp;laquo;дальней&amp;raquo; клетки, либо &amp;minus;1, если есть недостижимые клетки.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Просто BFS.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="height: 400px; overflow: auto;"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; MazeMaker {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; longestPath(vector &amp;lt;string&amp;gt; maze, &lt;span class="kw4"&gt;int&lt;/span&gt; startRow, &lt;span class="kw4"&gt;int&lt;/span&gt; startCol, vector &amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; moveRow, vector &amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; moveCol) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;size_t&lt;/span&gt; n = maze.size(), m = maze[&lt;span class="nu0"&gt;0&lt;/span&gt;].length();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt; vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &amp;gt; dp(n, vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;(m, &lt;span class="nu0"&gt;-1&lt;/span&gt;));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt; pair&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &amp;gt; wave, nwave;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wave.push_back(make_pair(startRow, startCol));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dp[startRow][startCol] = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;bool&lt;/span&gt; was;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; turn = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;do&lt;/span&gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nwave.clear();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was = &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;, len = wave.size(); i &amp;lt; len; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;, len = moveRow.size(); j &amp;lt; len; ++j) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; newr = wave[i].first + moveRow[j], newc = wave[i].second + moveCol[j];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (newr &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt; || newr &amp;gt;= n || newc &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt; || newc &amp;gt;= m) &lt;span class="kw1"&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (maze[newr][newc] == &lt;span class="st0"&gt;'.'&lt;/span&gt; &amp;amp;&amp;amp; dp[newr][newc] == &lt;span class="nu0"&gt;-1&lt;/span&gt;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dp[newr][newc] = turn + &lt;span class="nu0"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nwave.push_back(make_pair(newr, newc));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was = &lt;span class="kw2"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wave.swap(nwave);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ++turn;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;span class="kw1"&gt;while&lt;/span&gt; (was);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; result = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; n; ++i) &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; m; ++j) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (maze[i][j] == &lt;span class="st0"&gt;'.'&lt;/span&gt;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (dp[i][j] == &lt;span class="nu0"&gt;-1&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="nu0"&gt;-1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result = max(result, dp[i][j]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10421"&gt;div2 1000&lt;/a&gt;&lt;/b&gt; (автор &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=13351270"&gt;&lt;font color="#EE0000"&gt;&lt;b&gt;Vasyl(alphacom)&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;)&lt;br /&gt;&lt;i&gt;Найти максимальное произведение элементов подпоследовательности длины k заданной последовательности (до 50 элементов из [&amp;minus;50; 50]) такой, что ее соседние элементы не дальше maxDist друг от друга.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Динамика [длина подпоследовательности][последний элемент подпоследовательности] = максимальное произведение; минимальное произведение; минимальный модуль произведения.&lt;br /&gt;Минимальное произведение может стать максимальным, если попадется отрицательный множитель, поэтому его тоже надо считать. Если же в итоге среди максимальных произведений не окажется ни одного положительного, следует вернуть минимальное по модулю со знаком минус.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="height: 400px; overflow: auto;"&gt;&lt;br /&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; TheProduct {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; maxProduct(vector &amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; numbers, &lt;span class="kw4"&gt;int&lt;/span&gt; k, &lt;span class="kw4"&gt;int&lt;/span&gt; maxDist) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;size_t&lt;/span&gt; n = numbers.size();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt; vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; maxdp(k + &lt;span class="nu0"&gt;1&lt;/span&gt;, vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;(n, numeric_limits&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;::min())),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mindp(k + &lt;span class="nu0"&gt;1&lt;/span&gt;, vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;(n, numeric_limits&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;::max())),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; minabsdp(k + &lt;span class="nu0"&gt;1&lt;/span&gt;, vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;(n, numeric_limits&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;::max()));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; n; ++i) { mindp[&lt;span class="nu0"&gt;1&lt;/span&gt;][i] = maxdp[&lt;span class="nu0"&gt;1&lt;/span&gt;][i] = numbers[i]; minabsdp[&lt;span class="nu0"&gt;1&lt;/span&gt;][i] = abs(numbers[i]); }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; step = &lt;span class="nu0"&gt;2&lt;/span&gt;; step &amp;lt;= k; ++step) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = step - &lt;span class="nu0"&gt;2&lt;/span&gt;; i &amp;lt; n; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; next = i + &lt;span class="nu0"&gt;1&lt;/span&gt;, end = min(n - &lt;span class="nu0"&gt;1&lt;/span&gt;, i + maxDist); next &amp;lt;= end; ++next) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; maxdp[step][next] = max(maxdp[step][next], max(maxdp[step - &lt;span class="nu0"&gt;1&lt;/span&gt;][i] * numbers[next], mindp[step - &lt;span class="nu0"&gt;1&lt;/span&gt;][i] * numbers[next]));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mindp[step][next] = min(mindp[step][next], min(maxdp[step - &lt;span class="nu0"&gt;1&lt;/span&gt;][i] * numbers[next], mindp[step - &lt;span class="nu0"&gt;1&lt;/span&gt;][i] * numbers[next]));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; minabsdp[step][next] = min(minabsdp[step][next], abs(minabsdp[step - &lt;span class="nu0"&gt;1&lt;/span&gt;][i] * numbers[next]));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; result = *max_element(maxdp[k].begin(), maxdp[k].end());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; result &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt; ? -*min_element(minabsdp[k].begin(), minabsdp[k].end()) : result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10412"&gt;div1 450&lt;/a&gt;&lt;/b&gt; (автор &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=8357090"&gt;&lt;font color="#EE0000"&gt;&lt;b&gt;misof&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;)&lt;br /&gt;&lt;i&gt;Планарные графы (не обязательно связные) стоят V&lt;sup&gt;3&lt;/sup&gt;+E&lt;sup&gt;2&lt;/sup&gt; золотых. Нужно набрать их точно на N золотых (до 50к), закупив минимальное число; разрешается покупать несколько графов одного вида.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Классическая задача на оплату минимальным количеством монет, решается ДП [стоимость] = минимальное количество графов. Чтобы получить цены планарных графов, следует вспомнить формулу Эйлера В + Г &amp;minus; Р = 2 для выпуклых многогранников и планарных графов и сообразить, что в планарном графе максимальное количество ребер когда все грани имеют по 3 ребра. Тогда V + 2E/3 &amp;minus; E = 2, откуда E = 3(V &amp;minus; 2). Если в графе больше ребер, он не планарный. Если столько, то планарные графы существуют (например, треугольник, к которому для каждой добавляемой вершины к каждой вершине треугольной оболочки присоединяют по ребру), хотя существуют и непланарные, например, &lt;a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84_%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D1%81%D0%B5%D0%BD%D0%B0"&gt;граф Петерсена&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; PlanarGraphShop {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; bestCount(&lt;span class="kw4"&gt;int&lt;/span&gt; N) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; M = &lt;span class="nu0"&gt;50000&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; dp(M + &lt;span class="nu0"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; v = &lt;span class="nu0"&gt;1&lt;/span&gt;; v * v * v &amp;lt;= N; ++v) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; e = &lt;span class="nu0"&gt;0&lt;/span&gt;; e &amp;lt;= max(v - &lt;span class="nu0"&gt;1&lt;/span&gt;, &lt;span class="nu0"&gt;3&lt;/span&gt; * v - &lt;span class="nu0"&gt;6&lt;/span&gt;); ++e) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; cost = v * v * v + e * e;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt;= min(cost, N - cost); ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;int&lt;/span&gt; c = &lt;span class="nu0"&gt;1&lt;/span&gt;; i + cost * c &amp;lt;= N; ++c) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (dp[i + cost * c] &amp;gt; dp[i] + c || dp[i + cost * c] == &lt;span class="nu0"&gt;0&lt;/span&gt;) dp[i + cost * c] = dp[i] + c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; dp[N];&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.topcoder.com/stat?c=problem_statement&amp;amp;pm=10420"&gt;div1 1000&lt;/a&gt;&lt;/b&gt; (автор &amp;mdash; &lt;a href="http://www.topcoder.com/tc?module=MemberProfile&amp;amp;cr=13351270"&gt;&lt;font color="#EE0000"&gt;&lt;b&gt;Vasyl(alphacom)&lt;/b&gt;&lt;/font&gt;&lt;/a&gt;)&lt;br /&gt;&lt;i&gt;Счастливое число состоит только из 4 и 7. Почти счастливое делится на счастливое. Найти количество почти счастливых чисел в [a;b] (числа до 10ккк).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Найдем количества не делящихся на счастливые числа чисел в [1;x] с помощью &lt;a href="http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"&gt;формулы включения-исключения&lt;/a&gt;. Отметим, что конъюнкция делимостей на набор чисел равносильна делимости на НОК этого набора. К счастью, нам не придется перебирать все 2&lt;sup&gt;2046&lt;/sup&gt; подмножеств, потому что НОК большинства из них гораздо больше 10ккк. К тому же, из набора можно убрать кратные числа (типа 4747), не привносящие ничего нового, и полученный набор отсортировать по убыванию (этого грязного хака я не понял, буду рад, если кто-нибудь объяснит). Тогда рекурсия, принимающая текущий НОК набора и номер его последнего элемента заходит в TL.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="height: 400px; overflow: auto;"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; TheAlmostLuckyNumbers {&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; M = 10000000000LL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt; lucky;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;size_t&lt;/span&gt; nlucky;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; gcd(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; a, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; b)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;while&lt;/span&gt; (a &amp;amp;&amp;amp; b) { &lt;span class="kw1"&gt;if&lt;/span&gt; (a &amp;gt; b) a %= b; &lt;span class="kw1"&gt;else&lt;/span&gt; b %= a; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; a + b;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; lcm(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; a, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; b)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; d = a / gcd(a, b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; ((&lt;span class="kw4"&gt;double&lt;/span&gt;) M / d &amp;gt; b) ? d * b : numeric_limits&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;::max();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; TheAlmostLuckyNumbers()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt; prelucky;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gen(prelucky, &lt;span class="nu0"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sort(prelucky.begin(), prelucky.end());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;, j, len = prelucky.size(); i &amp;lt; len; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (j = &lt;span class="nu0"&gt;0&lt;/span&gt;; j &amp;lt; i; ++j) &lt;span class="kw1"&gt;if&lt;/span&gt; (prelucky[i] % prelucky[j] == &lt;span class="nu0"&gt;0&lt;/span&gt;) &lt;span class="kw1"&gt;break&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (j == i) lucky.push_back(prelucky[i]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sort(lucky.begin(), lucky.end(), greater&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nlucky = lucky.size();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;void&lt;/span&gt; gen(vector&amp;lt;&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt;&amp;gt;&amp;amp; res, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; n)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res.push_back(n * &lt;span class="nu0"&gt;10&lt;/span&gt; + &lt;span class="nu0"&gt;4&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res.push_back(n * &lt;span class="nu0"&gt;10&lt;/span&gt; + &lt;span class="nu0"&gt;7&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (n &amp;lt; M / &lt;span class="nu0"&gt;100&lt;/span&gt;) gen(res, n * &lt;span class="nu0"&gt;10&lt;/span&gt; + &lt;span class="nu0"&gt;4&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (n &amp;lt; M / &lt;span class="nu0"&gt;100&lt;/span&gt;) gen(res, n * &lt;span class="nu0"&gt;10&lt;/span&gt; + &lt;span class="nu0"&gt;7&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; inclexcl(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; a, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; clcm = &lt;span class="nu0"&gt;1&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; last = &lt;span class="nu0"&gt;-1&lt;/span&gt;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; result = a / clcm;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw4"&gt;size_t&lt;/span&gt; i = last + &lt;span class="nu0"&gt;1&lt;/span&gt;; i &amp;lt; nlucky; ++i) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; nlcm = lcm(clcm, lucky[i]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; (nlcm &amp;lt;= a) result -= inclexcl(a, nlcm, i);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; count(&lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; a, &lt;span class="kw4"&gt;long&lt;/span&gt; &lt;span class="kw4"&gt;long&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; (b - inclexcl(b)) - (a - &lt;span class="nu0"&gt;1&lt;/span&gt; - inclexcl(a - &lt;span class="nu0"&gt;1&lt;/span&gt;));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Дописывая этот пост, я стал свидетелем презанятнейшего явления &amp;mdash; &lt;b&gt;&lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D1%81%D0%BF%D1%8B%D1%88%D0%BA%D0%B0_%D0%98%D1%80%D0%B8%D0%B4%D0%B8%D1%83%D0%BC%D0%B0"&gt;вспышки &amp;laquo;Иридиума&amp;raquo;&lt;/a&gt;&lt;/b&gt;. Это ярчайшее звездоподобное явление (до &lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%B4%D0%B8%D0%BC%D0%B0%D1%8F_%D0%B7%D0%B2%D1%91%D0%B7%D0%B4%D0%BD%D0%B0%D1%8F_%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B8%D0%BD%D0%B0"&gt;&amp;minus;9.5&lt;sup&gt;m&lt;/sup&gt;&lt;/a&gt;), даже ярче сверхновой 1054 года (&amp;minus;6&lt;sup&gt;m&lt;/sup&gt;), которое, увы, длится недолго, всего несколько секунд. Его суть состоит в том, что один из 66 спутников космической связи &amp;laquo;Иридиум&amp;raquo; ВНЕЗАПНО отражает солнечный свет своей антенной, и тот попадает наблюдателю прямо в глаз.&lt;br /&gt;&lt;br /&gt;Выглядело это примерно так: в серо-голубом предрассветном небе, в котором уже не было видно ни одной звезды, вдруг появилась удивительно яркая, быстро движущаяся звездочка (&amp;minus;7&lt;sup&gt;m&lt;/sup&gt;), и за 3-4 секунды погасла. К счастью, сегодня было две вспышки подряд, разделенные интервалом 9 минут, потому что я чуть не пропустил первую, ошибившись с северным направлением градусов на 15. Товарищ &lt;span class='ljuser ljuser-name_shuffle_c' lj:user='shuffle_c' style='white-space: nowrap;'&gt;&lt;a href='http://shuffle-c.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://shuffle-c.livejournal.com/'&gt;&lt;b&gt;shuffle_c&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; предложил замечательное использование явлению: дарить звезды любимым девушкам, вооружившись &lt;a href="http://www.heavens-above.com/"&gt;расписанием вспышек&lt;/a&gt; для вашей местности :)&lt;br /&gt;&lt;br /&gt;А еще швейцарский коллектив &lt;b&gt;Lunatica&lt;/b&gt; в этом году пополнил замечательный список из групп Delain, Edenbridge, After Forever, Эпидемия, Theatre of Tragedy, Rhapsody of Fire и Ayreon, последние альбомы которых сильно превосходят предыдущее творчество. На их нетленке &lt;b&gt;New Shores&lt;/b&gt; замечательна каждая композиция. Голландцы &lt;b&gt;Epica&lt;/b&gt; тоже весьма порадовали альбомом &lt;b&gt;Design Your Universe&lt;/b&gt;, но он, увы, не стал прыжком вперед.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:54068</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/54068.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=54068"/>
    <title>У нее тоже есть имя!</title>
    <published>2009-11-23T14:00:22Z</published>
    <updated>2009-11-23T14:00:22Z</updated>
    <category term="наука"/>
    <lj:music>Rhapsody of Fire — [Triumph or Agony #05] The Myth of the Holy Sword</lj:music>
    <content type="html">Среди четырех ярчайших звезд с отрицательной видимой звездной величиной фигурируют Сириус, Канопус и Арктур. А вот четвертую, несмотря на то, что ее тройная система находится ближе к Солнцу, чем любая другая звезда, называют всегда по букве &amp;mdash; &amp;alpha; Центавра. Но у нее тоже есть имя &amp;mdash; &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%81%D0%B0%D0%BC%D1%8B%D1%85_%D1%8F%D1%80%D0%BA%D0%B8%D1%85_%D0%B7%D0%B2%D1%91%D0%B7%D0%B4"&gt;Толиман&lt;/a&gt;!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:53998</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/53998.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=53998"/>
    <title>Тайна чабреца</title>
    <published>2009-11-19T13:11:07Z</published>
    <updated>2009-11-19T13:11:07Z</updated>
    <category term="юмор"/>
    <lj:music>Кипелов — [Реки Времен #09] Призрачный Взвод</lj:music>
    <content type="html">&lt;i&gt;&lt;a href="http://www.greenfieldtea.ru/r/spring-melody/"&gt;Существует&lt;/a&gt; старинное поверье, согласно которому человек, посадивший чабрец у себя в саду, непременно встретит эльфов – привлеченные пряным свежим ароматом душистой травы, они поспешат в дом, готовые исполнить любое заветное желание…&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007s0hg" /&gt;&lt;br /&gt;&lt;br /&gt;Оказывается, достаточно просто посадить чабрец!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:53573</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/53573.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=53573"/>
    <title>sharpc @ 2009-11-07T20:01:00</title>
    <published>2009-11-07T18:01:46Z</published>
    <updated>2009-11-07T18:02:13Z</updated>
    <content type="html">&lt;h1 style="padding: 5px 10px 5px 10px; background: #cc0000; color: #ffd700"&gt;&amp;nbsp; С праздником! &amp;nbsp;&lt;/h1&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:53394</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/53394.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=53394"/>
    <title>Хелловорлд на C++</title>
    <published>2009-10-18T11:04:44Z</published>
    <updated>2009-10-18T11:04:44Z</updated>
    <category term="программирование"/>
    <category term="юмор"/>
    <lj:music>Draconian — [The Burning Halo #01] She dies</lj:music>
    <content type="html">Кажется, я переплюнул Master Programmer из &lt;a href="http://www.lib.ru/ANEKDOTY/progrev.txt"&gt;древнего бояна&lt;/a&gt; :) Подготовленный читатель без труда сообразит, реализация чего на няшных шаблончиках&lt;sup&gt;обожание!&lt;/sup&gt; приведена под катом.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="co2"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="co2"&gt;#include &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="co2"&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;using&lt;/span&gt; &lt;span class="kw2"&gt;namespace&lt;/span&gt; std;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// L - compile-time список символов&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; Head = &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTail = &lt;span class="kw4"&gt;void&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; L {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; head { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt; value = Head; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tail { &lt;span class="kw4"&gt;typedef&lt;/span&gt; TTail type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Элемент списка&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; item { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt; value = TTail::item&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::value; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; item&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;&amp;gt; { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt; value = Head; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Длина списка&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; length { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="nu0"&gt;1&lt;/span&gt; + TTail::length::value; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Префикс&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; prefix { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; L&amp;lt;Head, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTail::prefix&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::type&amp;gt; type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; prefix&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;&amp;gt; { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;&amp;gt; type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Суффикс&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; suffix { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTail::suffix&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::type type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; suffix&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;&amp;gt; { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;Head, TTail&amp;gt; type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Размещение в заданной позиции заданного символа&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Pos, &lt;span class="kw4"&gt;char&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; place { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;Head, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTail::place&amp;lt;Pos&lt;span class="nu0"&gt;-1&lt;/span&gt;, N&amp;gt;::type&amp;gt; type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; place&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;, N&amp;gt; { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;N, TTail&amp;gt; type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="co1"&gt;// Пустой список&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; L&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="kw4"&gt;void&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; length { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="nu0"&gt;0&lt;/span&gt;; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; prefix { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;&amp;gt; type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; suffix { &lt;span class="kw4"&gt;typedef&lt;/span&gt; L&amp;lt;&amp;gt; type; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// Reverse - обращение списка&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TList, &lt;span class="kw2"&gt;typename&lt;/span&gt; TCurrent = L&amp;lt;&amp;gt; &amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; Reverse {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; Reverse&amp;lt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TList::tail::type, L&amp;lt;TList::head::value, TCurrent&amp;gt; &amp;gt;::type type;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TCurrent&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; Reverse&amp;lt; L&amp;lt;&amp;gt;, TCurrent &amp;gt; { &lt;span class="kw4"&gt;typedef&lt;/span&gt; TCurrent type; };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// TapeHelper расширяет Tape влево или вправо в зависимости от того, какой индекс на ленте потребовался&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList, &lt;span class="kw4"&gt;int&lt;/span&gt; TapeZeroPtr, &lt;span class="kw4"&gt;int&lt;/span&gt; TapePtr, &lt;span class="kw4"&gt;bool&lt;/span&gt; ExtendLeft, &lt;span class="kw4"&gt;bool&lt;/span&gt; ExtendRight&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; TapeHelper { };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList, &lt;span class="kw4"&gt;int&lt;/span&gt; TapeZeroPtr, &lt;span class="kw4"&gt;int&lt;/span&gt; TapePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; TapeHelper&amp;lt;TTape, TTapeList, TapeZeroPtr, TapePtr, &lt;span class="kw2"&gt;false&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; TTape&amp;lt;TTapeList, TapeZeroPtr, TapePtr&amp;gt; type;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList, &lt;span class="kw4"&gt;int&lt;/span&gt; TapeZeroPtr, &lt;span class="kw4"&gt;int&lt;/span&gt; TapePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; TapeHelper&amp;lt;TTape, TTapeList, TapeZeroPtr, TapePtr, &lt;span class="kw2"&gt;true&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TapeHelper&amp;lt;TTape, L&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;, TTapeList&amp;gt;, TapeZeroPtr + &lt;span class="nu0"&gt;1&lt;/span&gt;, TapePtr, TapeZeroPtr + &lt;span class="nu0"&gt;1&lt;/span&gt; + TapePtr &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&amp;gt;::type type;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList, &lt;span class="kw4"&gt;int&lt;/span&gt; TapeZeroPtr, &lt;span class="kw4"&gt;int&lt;/span&gt; TapePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; TapeHelper&amp;lt;TTape, TTapeList, TapeZeroPtr, TapePtr, &lt;span class="kw2"&gt;false&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TapeHelper&amp;lt;TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; Reverse&amp;lt; L&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="kw2"&gt;typename&lt;/span&gt; Reverse&amp;lt;TTapeList&amp;gt;::type&amp;gt; &amp;gt;::type, TapeZeroPtr, TapePtr, &lt;span class="kw2"&gt;false&lt;/span&gt;, TapeZeroPtr + TapePtr &amp;gt;= TTapeList::length::value + &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt;::type type;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// Tape содержит ленту, указатель на нулевой элемент и указатель на текущий элемент&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList = L&amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;, L&amp;lt;&amp;gt; &amp;gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; TapeZeroPtr = &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; TapePtr = &lt;span class="nu0"&gt;0&lt;/span&gt; &amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; Tape {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; current { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;char&lt;/span&gt; value = TTapeList::item&amp;lt;TapeZeroPtr + TapePtr&amp;gt;::value; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Сдвиг указателя на текущий элемент влево или вправо&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; S&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; shift {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TapeHelper&amp;lt;::Tape, TTapeList, TapeZeroPtr, TapePtr + S,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TapeZeroPtr + TapePtr + S &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;, TapeZeroPtr + TapePtr + S &amp;gt;= TTapeList::length::value&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt;::type type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Размещение в текущей позиции нужного символа&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; place {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; Tape&amp;lt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTapeList::place&amp;lt;TapeZeroPtr + TapePtr, N&amp;gt;::type, TapeZeroPtr, TapePtr &amp;gt; type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// If возвращает целое значение True или False в зависимости от условия Condition&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;bool&lt;/span&gt; Condition, &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;True&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;False&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; &lt;span class="kw1"&gt;If&lt;/span&gt; { };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;True&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;False&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; &lt;span class="kw1"&gt;If&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;true&lt;/span&gt;, &lt;span class="kw2"&gt;True&lt;/span&gt;, &lt;span class="kw2"&gt;False&lt;/span&gt;&amp;gt; { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="kw2"&gt;True&lt;/span&gt;; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;True&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; &lt;span class="kw2"&gt;False&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; &lt;span class="kw1"&gt;If&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;false&lt;/span&gt;, &lt;span class="kw2"&gt;True&lt;/span&gt;, &lt;span class="kw2"&gt;False&lt;/span&gt;&amp;gt; { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="kw2"&gt;False&lt;/span&gt;; };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// FindNestedExit ищет сдвиг, по которому расположена закрывающая скобка соответствующего уровня вложенности&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TList, &lt;span class="kw4"&gt;char&lt;/span&gt; Entrance = &lt;span class="st0"&gt;'['&lt;/span&gt;, &lt;span class="kw4"&gt;char&lt;/span&gt; Exit = &lt;span class="st0"&gt;']'&lt;/span&gt;, &lt;span class="kw4"&gt;int&lt;/span&gt; Depth = &lt;span class="nu0"&gt;0&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; FindNestedExit {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="nu0"&gt;1&lt;/span&gt; +&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FindNestedExit&amp;lt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TList::tail::type, Entrance, Exit,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;If&lt;/span&gt;&amp;lt;TList::head::value == Entrance, Depth + &lt;span class="nu0"&gt;1&lt;/span&gt;, &lt;span class="kw1"&gt;If&lt;/span&gt;&amp;lt;TList::head::value == Exit, Depth - &lt;span class="nu0"&gt;1&lt;/span&gt;, Depth&amp;gt;::value&amp;gt;::value&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt;::value;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TListTail, &lt;span class="kw4"&gt;char&lt;/span&gt; Entrance, &lt;span class="kw4"&gt;char&lt;/span&gt; Exit&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; FindNestedExit&amp;lt;L&amp;lt;Exit, TListTail&amp;gt;, Entrance, Exit, &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// BFnext сообщает позицию следующего символа кода в зависимости от текущего и ленты&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; CodeCur, &lt;span class="kw4"&gt;char&lt;/span&gt; TapeCur, &lt;span class="kw2"&gt;typename&lt;/span&gt; TCode, &lt;span class="kw4"&gt;int&lt;/span&gt; CodePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFnext { &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = CodePtr + &lt;span class="nu0"&gt;1&lt;/span&gt;; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TCode, &lt;span class="kw4"&gt;int&lt;/span&gt; CodePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFnext&amp;lt;&lt;span class="st0"&gt;'['&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;, TCode, CodePtr&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = CodePtr + FindNestedExit&amp;lt;TCode::suffix&amp;lt;CodePtr&amp;gt;::type&amp;gt;::value + &lt;span class="nu0"&gt;1&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; TapeCur, &lt;span class="kw2"&gt;typename&lt;/span&gt; TCode, &lt;span class="kw4"&gt;int&lt;/span&gt; CodePtr&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFnext&amp;lt;&lt;span class="st0"&gt;']'&lt;/span&gt;, TapeCur, TCode, CodePtr&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; value = CodePtr - FindNestedExit&amp;lt; Reverse&amp;lt;TCode::prefix&amp;lt;CodePtr + &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt;::type&amp;gt;::type, &lt;span class="st0"&gt;']'&lt;/span&gt;, &lt;span class="st0"&gt;'['&lt;/span&gt; &amp;gt;::value;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// BFperform_no_(i|o|io|tape) указывает на то, что не производится изменения входа/выхода/ленты&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TInput&amp;gt; &amp;nbsp;&lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer_no_i { &lt;span class="kw4"&gt;struct&lt;/span&gt; input &amp;nbsp;{ &lt;span class="kw4"&gt;typedef&lt;/span&gt; TInput &amp;nbsp;type; }; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer_no_o { &lt;span class="kw4"&gt;struct&lt;/span&gt; output { &lt;span class="kw4"&gt;typedef&lt;/span&gt; TOutput type; }; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer_no_io : BFperformer_no_i&amp;lt;TInput&amp;gt;, BFperformer_no_o&amp;lt;TOutput&amp;gt; { };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer_no_tape { &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; TTape type; }; };&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// BFperformer осуществляет действие над лентой, входом и выходом в зависимости от текущего символа кода&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;char&lt;/span&gt; CodeCur, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer : BFperformer_no_io&amp;lt;TInput, TOutput&amp;gt;, BFperformer_no_tape&amp;lt;TTape&amp;gt; { };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_io&amp;lt;TInput, TOutput&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape::place&amp;lt;TTape::current::value + &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt;::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;'-'&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_io&amp;lt;TInput, TOutput&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape::place&amp;lt;TTape::current::value - &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt;::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;'&amp;lt;'&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_io&amp;lt;TInput, TOutput&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape::shift&amp;lt;&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_io&amp;lt;TInput, TOutput&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape::shift&amp;lt;&lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt;::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;','&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_o&amp;lt;TOutput&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; tape { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape::place&amp;lt;TInput::head::value&amp;gt;::type type; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; input { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput::tail::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFperformer&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, TTape, TInput, TOutput&amp;gt; : BFperformer_no_i&amp;lt;TInput&amp;gt;, BFperformer_no_tape&amp;lt;TTape&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; output { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; Reverse&amp;lt; L&amp;lt;TTape::current::value, &lt;span class="kw2"&gt;typename&lt;/span&gt; Reverse&amp;lt;TOutput&amp;gt;::type&amp;gt; &amp;gt;::type type; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// BFrunner преобразовывает тип-состояние (код-указатель на код-лента-вход-выход) пока указатель на код не выйдет за его пределы&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TCode, &lt;span class="kw4"&gt;int&lt;/span&gt; CodePtr, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput = L&amp;lt;&amp;gt;, &lt;span class="kw4"&gt;bool&lt;/span&gt; Stop = &lt;span class="kw2"&gt;false&lt;/span&gt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFrunner {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;class&lt;/span&gt; output {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; BFperformer&amp;lt;TCode::item&amp;lt;CodePtr&amp;gt;::value, TTape, TInput, TOutput&amp;gt; performer_t;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;const&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; nextCode = BFnext&amp;lt;TCode::item&amp;lt;CodePtr&amp;gt;::value, TTape::current::value, TCode, CodePtr&amp;gt;::value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt;:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; BFrunner&amp;lt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TCode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextCode,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;typename&lt;/span&gt; performer_t::tape::type,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;typename&lt;/span&gt; performer_t::input::type,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;typename&lt;/span&gt; performer_t::output::type,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextCode &amp;gt;= TCode::length::value&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt;::output::type type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TCode, &lt;span class="kw4"&gt;int&lt;/span&gt; CodePtr, &lt;span class="kw2"&gt;typename&lt;/span&gt; TTape, &lt;span class="kw2"&gt;typename&lt;/span&gt; TInput, &lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BFrunner&amp;lt;TCode, CodePtr, TTape, TInput, TOutput, &lt;span class="kw2"&gt;true&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;struct&lt;/span&gt; output { &lt;span class="kw4"&gt;typedef&lt;/span&gt; TOutput type; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// BF - оболочка над интерпретатором Brainfuck&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TCode&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; BF {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TInput&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; parse {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; BFrunner&amp;lt;TCode, &lt;span class="nu0"&gt;0&lt;/span&gt;, Tape&amp;lt;&amp;gt;, TInput&amp;gt;::output::type type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="co1"&gt;// visualise отображает тип-список символов как строку&lt;/span&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TOutput&amp;gt; string visualise() { &lt;span class="kw1"&gt;return&lt;/span&gt; string(&lt;span class="nu0"&gt;1&lt;/span&gt;, TOutput::head::value) + visualise&amp;lt;TOutput::tail::type&amp;gt;(); }&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; string visualise&amp;lt; L&amp;lt;&amp;gt; &amp;gt;() { &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;&amp;quot;&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'['&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;lt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;lt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;lt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;lt;'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'-'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;']'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'&amp;gt;'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; L&amp;lt;&lt;span class="st0"&gt;'+'&lt;/span&gt;, L&amp;lt;&lt;span class="st0"&gt;'.'&lt;/span&gt;, L&amp;lt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt; hello_t;&lt;br /&gt;&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; visualise&amp;lt;BF&amp;lt;hello_t&amp;gt;::parse&amp;lt;input_t&amp;gt;::type&amp;gt;() &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;На тот случай, если кто-то захочет поиграться, но писать списки символов ручками будет лень, поделюсь скриптом:&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&amp;lt;textarea cols=&amp;quot;80&amp;quot; rows=&amp;quot;10&amp;quot; id=&amp;quot;text&amp;quot;&amp;gt;+++++[&amp;gt;+++++&amp;lt;-]&amp;gt;[&amp;gt;+++&amp;gt;++++&amp;lt;&amp;lt;-]&amp;gt;---.&amp;gt;+.+++++++..+++.&amp;lt;/textarea&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;textarea cols=&amp;quot;80&amp;quot; rows=&amp;quot;10&amp;quot; id=&amp;quot;out&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;button onclick=&amp;quot;document.getElementById('out').value = transform(document.getElementById('text').value);&amp;quot;&amp;gt;Transform!&amp;lt;/button&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; transform(text) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; res = &lt;span class="st0"&gt;''&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw2"&gt;var&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; text.length; ++i) res += &lt;span class="st0"&gt;&amp;quot;L&amp;lt;'&amp;quot;&lt;/span&gt; + text.charAt(i) + &lt;span class="st0"&gt;&amp;quot;', &amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; res += &lt;span class="st0"&gt;'L&amp;lt;&amp;gt;'&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; (&lt;span class="kw2"&gt;var&lt;/span&gt; i = &lt;span class="nu0"&gt;0&lt;/span&gt;; i &amp;lt; text.length; ++i) res += &lt;span class="st0"&gt;' &amp;gt;'&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; res;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:53154</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/53154.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=53154"/>
    <title>Fight the C3200!</title>
    <published>2009-10-16T13:33:31Z</published>
    <updated>2009-11-05T08:01:36Z</updated>
    <category term="задачи"/>
    <category term="программирование"/>
    <lj:music>Michael Angelo — [Hands Without Shadows #04] Hands Without Shadows</lj:music>
    <content type="html">Исправив ошибку в этом коде:&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TB, &lt;span class="kw4"&gt;int&lt;/span&gt; X&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; A { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TB&amp;lt;X ^ &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt; type; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; X&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; B { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; A&amp;lt;B, X&amp;gt;::type type; };&lt;/div&gt;&lt;br /&gt;и отметив, что я потратил на нее примерно час, вы легко посчитаете мою производительность в КБ/сек :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Решено:&lt;/b&gt; верный ответ по аське дал &lt;span class='ljuser ljuser-name__denplusplus_' lj:user='_denplusplus_' style='white-space: nowrap;'&gt;&lt;a href='http://users.livejournal.com/_denplusplus_/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://users.livejournal.com/_denplusplus_/'&gt;&lt;b&gt;_denplusplus_&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Ошибка возникает из-за того, что &lt;tt&gt;B&lt;/tt&gt; в типе &lt;tt&gt;A&amp;lt;B, X&amp;gt;::type&lt;/tt&gt; внутри области видимости &lt;tt&gt;struct B&lt;/tt&gt; означает &lt;tt&gt;B&amp;lt;X&amp;gt;&lt;/tt&gt; (14.6.1.2). &lt;tt&gt;A&lt;/tt&gt; получает первым аргументом шаблона не шаблон, а его специализацию, и закручинивается. Для решения этой проблемы достаточно выйти из области видимости &lt;tt&gt;struct B&lt;/tt&gt;, например, написав &lt;tt&gt;::B&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TB, &lt;span class="kw4"&gt;int&lt;/span&gt; X&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; A { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; TB&amp;lt;X ^ &lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt; type; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; X&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; B { &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; A&amp;lt;::B, X&amp;gt;::type type; };&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:52830</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/52830.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=52830"/>
    <title>Не делайте этого дома</title>
    <published>2009-10-16T10:20:13Z</published>
    <updated>2009-10-16T10:20:13Z</updated>
    <content type="html">А что будет, если взять провод с вилками с обоих концов и вставить его в две розетки одновременно?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:52676</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/52676.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=52676"/>
    <title>Число хэшей с прообразами</title>
    <published>2009-09-20T14:17:56Z</published>
    <updated>2009-09-20T14:17:56Z</updated>
    <category term="задачи"/>
    <lj:music>Draconian — [Turning Season Within #03] Earthbound</lj:music>
    <content type="html">MD5-хэшей 2&lt;sup&gt;128&lt;/sup&gt; штук. Сколько из них имеет прообразы?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:52324</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/52324.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=52324"/>
    <title>Телепатические ответы</title>
    <published>2009-09-17T08:49:01Z</published>
    <updated>2009-09-17T08:49:01Z</updated>
    <category term="головоломки"/>
    <lj:music>Joe Dassin — [One Hour with Joe Dassin, Vol. 1 #08] Et si tu n'existais pas</lj:music>
    <content type="html">Прошло почти 5 месяцев со дня публикации последней задачки на телепатию, думаю, стоит опубликовать ответы.&lt;br /&gt;&lt;br /&gt;Кто желает в последний раз попробовать свои ментальные силы, смотрите &lt;a href="http://sharpc.livejournal.com/42464.html"&gt;этот пост&lt;/a&gt;, остальные — добро пожаловать под кат.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1. &lt;a href="http://sharpc.livejournal.com/42464.html"&gt;Вновь телепатия&lt;/a&gt;.&lt;/b&gt; Что изображено на картинке?&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00059dsa"&gt;&lt;br /&gt;&lt;br /&gt;Ближе всех к ответу была &lt;span class='ljuser ljuser-name_common_racoon' lj:user='common_racoon' style='white-space: nowrap;'&gt;&lt;a href='http://common-racoon.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://common-racoon.livejournal.com/'&gt;&lt;b&gt;common_racoon&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. На картинке разными цветами обозначены области на целочисленной комплексной плоскости, представимые разным количеством цифр (от 1 до 16) в двоичной системе счисления с основанием i−1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. &lt;a href="http://sharpc.livejournal.com/34726.html"&gt;Геометрический тервер&lt;/a&gt;.&lt;/b&gt; В единичный квадрат равномерно случайно накидали N точек. Построили по ним триангуляцию Делоне. Накидали еще N точек равномерно случайно. Треугольники, в которые попала хотя бы одна из точек, закрасили. Найти матожидание (а лучше распределение) закрашенной площади при N &amp;rarr; ∞.&lt;br /&gt;&lt;br /&gt;Эту задачу я не решил, ограничившись рассмотрением случая треугольной и квадратной сетки. Несложно посчитать, что в обоих случаях искомая площадь стремится к e&lt;sup&gt;&amp;minus;0.5&lt;/sup&gt;. Полагаю, что это верно для любого случая, и предоставляю возможность это доказать заинтересованному читателю.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. &lt;a href="http://sharpc.livejournal.com/35422.html"&gt;Энтомология. Красим таблицу Менделеева&lt;/a&gt;.&lt;/b&gt; Последовательность элементов таблицы Менделеева задается в текстовом файле, скрипт оттуда все считывает, нумерует, выдает в таблицу и раскрашивает, как положено. Раскрашивать удобнее всего стилями. Для начала пригодится стиль для ячейки с элементом elem, стиль с именем самого элемента, например Hf и стили, согласно которым ячейки будут помечаться цветом — s, p, d, f, согласно электронной конфигурации элемента. Класс элемента вычисляется такой функцией:&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw2"&gt;function&lt;/span&gt; spdf(&lt;span class="re1"&gt;$n&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re1"&gt;$inert&lt;/span&gt; = array(&lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;2&lt;/span&gt;, &lt;span class="nu0"&gt;10&lt;/span&gt;, &lt;span class="nu0"&gt;18&lt;/span&gt;, &lt;span class="nu0"&gt;36&lt;/span&gt;, &lt;span class="nu0"&gt;54&lt;/span&gt;, &lt;span class="nu0"&gt;86&lt;/span&gt;, &lt;span class="nu0"&gt;118&lt;/span&gt;, &lt;span class="nu0"&gt;164&lt;/span&gt;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re1"&gt;$i&lt;/span&gt; = &lt;span class="nu0"&gt;0&lt;/span&gt;; &lt;span class="re1"&gt;$full&lt;/span&gt; = &lt;span class="re1"&gt;$i&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;while&lt;/span&gt; (&lt;span class="re1"&gt;$inert&lt;/span&gt;[&lt;span class="re1"&gt;$i&lt;/span&gt;] &amp;lt;= &lt;span class="re1"&gt;$n&lt;/span&gt;) &lt;span class="re1"&gt;$full&lt;/span&gt; = &lt;span class="re1"&gt;$i&lt;/span&gt;++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="re1"&gt;$pi&lt;/span&gt; = &lt;span class="re1"&gt;$inert&lt;/span&gt;[&lt;span class="re1"&gt;$full&lt;/span&gt;]; &lt;span class="re1"&gt;$ni&lt;/span&gt; = &lt;span class="re1"&gt;$inert&lt;/span&gt;[&lt;span class="re1"&gt;$full&lt;/span&gt; + &lt;span class="nu0"&gt;1&lt;/span&gt;];&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;(&lt;span class="re1"&gt;$n&lt;/span&gt; == &lt;span class="re1"&gt;$pi&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;(&lt;span class="re1"&gt;$n&lt;/span&gt; - &lt;span class="re1"&gt;$pi&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;3&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;(&lt;span class="re1"&gt;$ni&lt;/span&gt; - &lt;span class="re1"&gt;$n&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;6&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt;(&lt;span class="re1"&gt;$ni&lt;/span&gt; - &lt;span class="re1"&gt;$n&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;16&lt;/span&gt;) &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;f&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;Но вот беда: в итоговой таблице все-все элементы выводятся верно (своими цветами, на своих местах), кроме фтора. (На самом деле еще гелий по ошибке был записан в p-элементы).&lt;br /&gt;&lt;br /&gt;Ближе всех к ответу были &lt;span class='ljuser ljuser-name_15v' lj:user='15v' style='white-space: nowrap;'&gt;&lt;a href='http://15v.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://15v.livejournal.com/'&gt;&lt;b&gt;15v&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; и &lt;span class='ljuser ljuser-name_maximkat' lj:user='maximkat' style='white-space: nowrap;'&gt;&lt;a href='http://maximkat.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://maximkat.livejournal.com/'&gt;&lt;b&gt;maximkat&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Проблема была в том, что стили CSS регистронезависимые, и названия элементов S (сера), P (фосфор) и F (фтор) пересекались с названиями классов s, p и f. Но это не все, потому что неверно отображался только фтор. Второй шаг к ответу заключался в том, что стили применяются и перекрывают друг другу в порядке описания, если не указан атрибут &lt;tt&gt;!important&lt;/tt&gt;. S, P и F — p-элементы, но только у фтора стиль его названия перекрыл стиль его электронного класса.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. &lt;a href="http://sharpc.livejournal.com/36198.html"&gt;...И тормознул крутейший массив&lt;/a&gt;.&lt;/b&gt; В языке PHP одним из самых широко используемых типов данных является массив. Массив в PHP ассоциативный, позволяет сопоставлять строковому или целочисленному ключу произвольное значение. Я сгенерировал два ассоциативных массива одного размера, с одинаковыми значениями: все ключи в них — строковые, с длиной строки 6 символов. Однако тысячекратная сумма элементов первого массива вычисляется 1.148 секунд, а второго 26.928 секунд.&lt;br /&gt;&lt;br /&gt;Ближе всех были &lt;span class='ljuser ljuser-name_e_maxx_wasm' lj:user='e_maxx_wasm' style='white-space: nowrap;'&gt;&lt;a href='http://e-maxx-wasm.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://e-maxx-wasm.livejournal.com/'&gt;&lt;b&gt;e_maxx_wasm&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; и &lt;span class='ljuser ljuser-name_palindromer' lj:user='palindromer' style='white-space: nowrap;'&gt;&lt;a href='http://palindromer.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://palindromer.livejournal.com/'&gt;&lt;b&gt;palindromer&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Ассоциативный массив в PHP это открытая хэш-таблица с хэш-функцией &lt;tt&gt;hash(i) = hash(i-1) * 33 + str[i]&lt;/tt&gt;. Подобрать коллизии к ней несложно, что я и сделал.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. &lt;a href="http://sharpc.livejournal.com/40732.html"&gt;Телепатия против 24 байт&lt;/a&gt;.&lt;/b&gt; 4A 89 9E 4E 18 A7 82 C0 2B 78 17 AD B5 EA CB 79 FB 54 9E B7 9A 77 EF BE&lt;br /&gt;В них сокрыто известное любителям криптографии сообщение. Для получения сообщения над этими 24 байтами нужно произвести ровно одно действие.&lt;br /&gt;&lt;br /&gt;Теплее всех были предположения &lt;span class='ljuser ljuser-name_mehas' lj:user='mehas' style='white-space: nowrap;'&gt;&lt;a href='http://mehas.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://mehas.livejournal.com/'&gt;&lt;b&gt;mehas&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; и &lt;span class='ljuser ljuser-name_secondary_tea' lj:user='secondary_tea' style='white-space: nowrap;'&gt;&lt;a href='http://secondary-tea.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://secondary-tea.livejournal.com/'&gt;&lt;b&gt;secondary_tea&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Для получения сообщения надо эти 24 байта base64-закодировать. Получится SomeThingsAreBetterLeftUnread+++ — намек на скрытое сообщение распределенно забрутфорсенного &lt;a href="http://www.distributed.net/rc5/"&gt;проекта RC5-64&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. &lt;a href="http://sharpc.livejournal.com/41910.html"&gt;Мы ищем телепатов&lt;/a&gt;.&lt;/b&gt; Что изображено на картинке?&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00053p21" /&gt;&lt;br /&gt;В апдейте поста была дана стихотворная подсказка (навеянная сравнением графика с кометой и диаграммой Герцшпрунга-Рассела):&lt;br /&gt;&lt;i&gt;Одна пронесется.., другая — &lt;br /&gt;со шлейфом искрящимся вслед, &lt;br /&gt;но лучше смотреть, не моргая, &lt;br /&gt;на этот космический свет. &lt;br /&gt;Так можно увидеть скорее, &lt;br /&gt;что шлейф — только пыль, полоса, &lt;br /&gt;и свет этот вовсе не греет, &lt;br /&gt;а только слепит глаза.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Единственное отдаленно теплое предположение высказал &lt;span class='ljuser ljuser-name_15v' lj:user='15v' style='white-space: nowrap;'&gt;&lt;a href='http://15v.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://15v.livejournal.com/'&gt;&lt;b&gt;15v&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Стихотворная подсказка &lt;a href="http://www.dolsky.ru/show_arhive.php?id=316"&gt;легко гуглится&lt;/a&gt;, ключ в ней:&lt;br /&gt;&lt;i&gt;Смотрю я на небо в роздых, &lt;br /&gt;и видится мне в простоте, &lt;br /&gt;что разные люди, как звезды. &lt;br /&gt;на разной горят высоте. &lt;br /&gt;И каждый по-своему светит, &lt;br /&gt;свершая неблизкий свой путь. &lt;br /&gt;В миры одинокие эти &lt;br /&gt;так хочется мне заглянуть...&lt;/i&gt;&lt;br /&gt;Каждая звезда это мой френд (на момент написания поста): зеленые — взаимные, синие — зафрендившие меня, красные — зафренженные мной. Координаты — количество зафрендивших / количество зафренженных. Пересечением двух линий отмечен я.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:52202</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/52202.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=52202"/>
    <title>Scratch и диаграммы Насси-Шнейдермана</title>
    <published>2009-09-09T05:26:49Z</published>
    <updated>2009-09-09T05:26:49Z</updated>
    <category term="бш"/>
    <category term="программирование"/>
    <lj:music>Ayreon — [01011001 CD2 #06] E=MC2</lj:music>
    <content type="html">В игрушечном языке программирования &lt;a href="http://en.wikipedia.org/wiki/Scratch_programming_language"&gt;Scratch&lt;/a&gt; используются мои любимые &lt;a href="http://en.wikipedia.org/wiki/Nassi-Shneiderman_diagram"&gt;диаграммы Насси-Шнейдермана&lt;/a&gt; (смерть блок-схемам!).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007p7qr" /&gt;&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007qz6f" /&gt;&lt;br /&gt;&lt;br /&gt;Нашел я упоминание о нем в очень светлоджедайской статье на Хабре &lt;a href="http://habrahabr.ru/blogs/study/69092/"&gt;«Classmate/OLPC лагерь»&lt;/a&gt;. Автор статьи задается вопросом «Будут ли отличаться от своих сверстников дети, которым показали, что работать и создавать — это приятно и интересно?». В качестве ответа на него приведу аббревиатуру МАН и посетую на количество участников.&lt;br /&gt;&lt;br /&gt;А вот при чем здесь этот фрукт и аббревиатура БШ, поймут немногие :)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007raz0" /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:51866</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/51866.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=51866"/>
    <title>Как сделать рынок лучше</title>
    <published>2009-09-08T06:33:19Z</published>
    <updated>2009-09-08T06:33:19Z</updated>
    <category term="политика"/>
    <category term="юмор"/>
    <lj:music>Sirenia — [Nine destinies and a downfall #03] One by one</lj:music>
    <content type="html">Нынешний мировой финансовый кризис стал тяжелым испытанием для бизнеса. Поставщики разоряются, реализаторы оказываются неспособны продать все товары, амортизация производства съедает последние запасы: компаниям угрожает банкротство, риски становятся неприемлемыми. В результате страдают все: потребители не получают необходимые товары, общая производительность рынка и его способность удовлетворять спрос неуклонно снижаются.&lt;br /&gt;&lt;br /&gt;Между тем, существует очень простое и элегантное решение, повсеместное внедрение которого почти полностью решит проблему банкротства и рисков бизнеса. Это &lt;b&gt;страхование наемными работниками прибыли нанимателя&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Идея состоит в том, чтобы устраивающиеся на работу наемные рабочие вносили страховой залог, равный, скажем трехмесячной прибыли, которую ожидает получить бизнесмен от труда этого рабочего. Если рабочий добросовестно выполняет свою работу, он не платит страховые взносы; если же месячная прибыль недостаточна, бизнесмен получает недостающую часть от страховой компании, а рабочий должен восстановить страховой залог взносом. При увольнении рабочий получает из своего залога выходное пособие, а бизнесмен оставшуюся часть, которая позволит ему отчасти скомпенсировать потерю сотрудника (не секрет, что сейчас тяжелое положение бизнеса не позволяет выплачивать сотрудникам выходное пособие, так что эта система — несомненный шаг вперед).&lt;br /&gt;&lt;br /&gt;На первый взгляд такой метод кажется неожиданным и даже может вызвать реакцию «платить за устройство на работу? никогда!». Но следует заметить, что такая система невыгодна только для лентяев, которые не приносят бизнесу никакой прибыли, ставя под удар всю отрасль и самих себя: добросовестные сотрудники, качественно выполняющие свою работу, с лихвой компенсируют свой залог всего за несколько месяцев труда, без задержек получая зарплату, и без ужаса остаться без копейки в случае увольнения.&lt;br /&gt;&lt;br /&gt;Кроме того, стоит отметить, что де-факто риски бизнеса и сейчас отчасти переносятся на потребителей и наемных рабочих. Например, любую рекламную компанию, в том числе и неудачную, все равно оплачивают покупатели товара. При найме предприниматель стремится получить не просто добросовестного, легко обучаемого сотрудника, а сотрудника, который уже выполнял достаточно долгое время почти такую же работу на другом месте: таким образом бизнес снижает свои риски, отказывая в найме людям, которые вполне могли бы успешно выполнять свою работу и приносить прибыль. Результатом такой несистематизированной и ненадежной страховки являются: безработица, в том числе и среди грамотных специалистов; абсолютно непрогнозируемая прибыль, которая не дает предприятию планомерно развиваться; неожиданные банкротства предприятий, которые тяжело влияют на всю цепочку поставщиков и реализаторов.&lt;br /&gt;&lt;br /&gt;Безусловно, эта схема далека от идеала, например, многим предприятиям придется провести серьезную работу по оценке деятельности своих сотрудников и отделов, чтобы рассчитать норму прибыли и ее распределение по страховым залогам. Но это позволит очистить бизнес от балласта, работать эффективнее и стабильнее, что принесет неоценимую пользу рынку. Неоспоримые плюсы получат и добросовестные рабочие за счет смягчения процесса найма, увеличения стабильности своего предприятия и оздоровления рынка в целом. Нельзя не учитывать и то, что похожая на предлагаемую схема уже давно и успешно действует во взаимоотношениях бизнеса и менеджеров по продажам. &lt;br /&gt;&lt;br /&gt;Пока что эта инициатива выглядит непривычно, но я уверен, что всего через несколько лет именно она станет основой выхода из кризиса!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:51483</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/51483.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=51483"/>
    <title>Бесконечные списки в C++</title>
    <published>2009-09-07T05:55:49Z</published>
    <updated>2009-09-07T05:55:49Z</updated>
    <category term="программирование"/>
    <lj:music>Visions of Atlantis — [Trinity #08] Return To You</lj:music>
    <content type="html">Почему-то утверждается, что ФЯП могут работать с бесконечными списками, а C++ не в силах. Пришла пора достойно ответить злопыхателям!&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="co2"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="co2"&gt;#include &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;using&lt;/span&gt; &lt;span class="kw2"&gt;namespace&lt;/span&gt; std;&lt;br /&gt;&lt;br /&gt;&lt;span class="co2"&gt;#define sci static const int&lt;/span&gt;&lt;br /&gt;&lt;span class="co2"&gt;#define scb static const bool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; next { sci value = N + &lt;span class="nu0"&gt;1&lt;/span&gt;; };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Start, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; seq {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; seq&amp;lt;Start, Fn&amp;gt; type;&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = Start;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; head {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = TSeq::type::value;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; tail {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; &lt;span class="kw2"&gt;typename&lt;/span&gt; tail&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq::type&amp;gt;::type type;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Start, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; tail&amp;lt; seq&amp;lt;Start, Fn&amp;gt; &amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;typedef&lt;/span&gt; seq&amp;lt;Fn&amp;lt;Start&amp;gt;::value, Fn&amp;gt; type;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;bool&lt;/span&gt; finish, &lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; find_helper { };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; find_helper&amp;lt;&lt;span class="kw2"&gt;true&lt;/span&gt;, TSeq, Fn&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = head&amp;lt;TSeq&amp;gt;::value;&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; find_helper&amp;lt;&lt;span class="kw2"&gt;false&lt;/span&gt;, TSeq, Fn&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = find_helper&amp;lt; Fn&amp;lt;head&amp;lt; tail&amp;lt;TSeq&amp;gt; &amp;gt;::value&amp;gt;::value, tail&amp;lt;TSeq&amp;gt;, Fn &amp;gt;::value;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw2"&gt;typename&lt;/span&gt; TSeq, &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; Arg&amp;gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Fn&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; find {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = find_helper&amp;lt; Fn&amp;lt;head&amp;lt;TSeq&amp;gt;::value&amp;gt;::value, TSeq, Fn &amp;gt;::value;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; div13 {&lt;br /&gt;&amp;nbsp; &amp;nbsp; scb value = N % &lt;span class="nu0"&gt;13&lt;/span&gt; == &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; nthprime {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = find&amp;lt; seq&amp;lt;&lt;span class="nu0"&gt;1&lt;/span&gt; + nthprime&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::value, next&amp;gt;, nthprime&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::checkprime &amp;gt;::value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; M&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; checkprime {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scb value = M % value &amp;amp;&amp;amp; nthprime&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;::checkprime&amp;lt;M&amp;gt;::value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; nthprime&amp;lt;&lt;span class="nu0"&gt;1&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; sci value = &lt;span class="nu0"&gt;2&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; M&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; checkprime {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; scb value = M % &lt;span class="nu0"&gt;2&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; FillPrimes : &lt;span class="kw2"&gt;public&lt;/span&gt; FillPrimes&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; FillPrimes(vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;&amp;amp; primes) : FillPrimes&amp;lt;N&lt;span class="nu0"&gt;-1&lt;/span&gt;&amp;gt;(primes) { primes.push_back(nthprime&amp;lt;N&amp;gt;::value); }&lt;br /&gt;};&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; FillPrimes&amp;lt;&lt;span class="nu0"&gt;0&lt;/span&gt;&amp;gt; { FillPrimes(vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;&amp;amp; primes) { } };&lt;br /&gt;&lt;span class="kw2"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt; N&amp;gt; &lt;span class="kw4"&gt;struct&lt;/span&gt; GenPrimes : &lt;span class="kw2"&gt;public&lt;/span&gt; FillPrimes&amp;lt;N&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; GenPrimes(vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;&amp;amp; primes) : FillPrimes&amp;lt;N&amp;gt;(primes) { }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw4"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; find&amp;lt; seq&amp;lt;&lt;span class="nu0"&gt;42&lt;/span&gt;, next&amp;gt;, div13 &amp;gt;::value &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; head&amp;lt; tail&amp;lt; seq&amp;lt;&lt;span class="nu0"&gt;42&lt;/span&gt;, next&amp;gt; &amp;gt; &amp;gt;::value &amp;lt;&amp;lt; &lt;span class="st0"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &amp;lt;&amp;lt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; head&amp;lt; tail&amp;lt; tail&amp;lt; tail&amp;lt; tail &amp;lt; tail&amp;lt; tail&amp;lt; seq&amp;lt;&lt;span class="nu0"&gt;42&lt;/span&gt;, next&amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt; &amp;gt;::value &amp;lt;&amp;lt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; nthprime&amp;lt;&lt;span class="nu0"&gt;100&lt;/span&gt;&amp;gt;::value &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; vector&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt; primes;&lt;br /&gt;&amp;nbsp; &amp;nbsp; GenPrimes&amp;lt;&lt;span class="nu0"&gt;100&lt;/span&gt;&amp;gt; gen(primes);&lt;br /&gt;&amp;nbsp; &amp;nbsp; copy(primes.begin(), primes.end(), ostream_iterator&amp;lt;&lt;span class="kw4"&gt;int&lt;/span&gt;&amp;gt;(cout, &lt;span class="st0"&gt;&amp;quot; &amp;quot;&lt;/span&gt;));&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Кратко опишу, что здесь происходит.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;next&lt;/tt&gt; это просто статическая функция &lt;tt&gt;N =&amp;gt; N+1&lt;/tt&gt;.&lt;br /&gt;&lt;tt&gt;seq&lt;/tt&gt; это шаблон-генератор бесконечной последовательности &lt;tt&gt;int&lt;/tt&gt;, который принимает в качестве аргументов начальное значение и функцию, с помощью которой можно получить следующий элемент последовательности. Например, &lt;tt&gt;seq&amp;lt;42, next&amp;gt;&lt;/tt&gt; это бесконечная последовательность 42, 43, ...&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;head&lt;/tt&gt; и &lt;tt&gt;tail&lt;/tt&gt; — всем известные функции для получения начала (&lt;tt&gt;int&lt;/tt&gt;) и хвоста  (бесконечная последовательность) последовательности.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;find&lt;/tt&gt; ищет в бесконечной последовательности первое число, удовлетворяющее статической функции типа &lt;tt&gt;int -&amp;gt; bool&lt;/tt&gt;. Несложно увидеть, взглянув на шаблон &lt;tt&gt;find_helper&lt;/tt&gt;, почему компилятор не производит бесконечного раскрытия бесконечной последовательности.&lt;br /&gt;&lt;br /&gt;В качестве примера использования этого извращения предлагается:&lt;br /&gt;1) поиск первого числа в последовательности 42, ..., которое делится нацело на 13 (&lt;tt&gt;div13&lt;/tt&gt;).&lt;br /&gt;2) поиск головы хвоста 42, ... и головы 6 раз взятого хвоста от этой же последовательности.&lt;br /&gt;3) немного более сложный пример: вычисление 100-го простого числа (&lt;tt&gt;nthprime&lt;/tt&gt;). В последовательности nthprime&amp;lt;N-1&amp;gt;+1, ... ищется первое число, для которого проверка на простоту (взятием остатка от деления на все меньшие простые числа) дает true. Сложность такого алгоритма по количеству инстанцированных компилятором шаблонов примерно O(N&lt;sup&gt;2&lt;/sup&gt;lnN) (стоит упомянуть здесь &lt;a href="http://mathworld.wolfram.com/RossersTheorem.html"&gt;теорему Россера&lt;/a&gt;).&lt;br /&gt;4) увы, видимо, в C++ нет способа статически сгенерировать шаблонами массив, вектор или строку, поэтому заполнять вектор с первой сотней простых чисел приходится в рантайме — в конструкторах &lt;tt&gt;FillPrimes&lt;/tt&gt;. Конструкторы вызываются от самого старшего родителя (&lt;tt&gt;FillPrimes&amp;lt;0&amp;gt;&lt;/tt&gt;), поэтому push_back'и вызываются в нужном порядке.&lt;br /&gt;&lt;br /&gt;VC++ 2008 отжирает при компилировании этого примера около 580 метров, так что запаситесь терпением :)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:51337</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/51337.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=51337"/>
    <title>Южная экспедиция</title>
    <published>2009-09-04T23:23:02Z</published>
    <updated>2009-09-05T00:27:47Z</updated>
    <category term="фото"/>
    <category term="дыбр"/>
    <lj:music>Metallica — [Reload] The Memory Remains</lj:music>
    <content type="html">или Четвертая митуй-пати&lt;br /&gt;или 3 дня, 6 ботанов и 103 километра по &lt;strike&gt;прямой, как летают назгулы&lt;/strike&gt; Южному Берегу Крыма&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Shuffle, 07.08.2009 22:47:20: А ты как-нибудь поедешь еще в Питер?&lt;br /&gt;Sharp, 22:47:28: Вполне возможно&lt;br /&gt;Sharp, 22:47:46: Но лучше вы к нам :)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0007k78h"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007k78h/s320x320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Неотвратимое приближение осени и неутоленная жажда приключений привела к тому, что интервал между идеей и началом встречи сократился с почти двух лет (&lt;a href="http://sharpc.livejournal.com/14796.html"&gt;встреча в Ленинграде&lt;/a&gt; в феврале 2008 года) до одной недели. Кворум митуй-пати подразумевает наличие хотя бы трех митуйчан, посему в аську был брошен клич, и через некоторое время в экспедиции участвовали уже 6 человек:&lt;br /&gt;&lt;br /&gt;Шарп Грозный aka &lt;span class='ljuser ljuser-name_sharpc' lj:user='sharpc' style='white-space: nowrap;'&gt;&lt;a href='http://sharpc.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://sharpc.livejournal.com/'&gt;&lt;b&gt;sharpc&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; (Керчь)&lt;br /&gt;Шафл Рассудительный aka &lt;span class='ljuser ljuser-name_shuffle_c' lj:user='shuffle_c' style='white-space: nowrap;'&gt;&lt;a href='http://shuffle-c.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://shuffle-c.livejournal.com/'&gt;&lt;b&gt;shuffle_c&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; (Ленинград)&lt;br /&gt;Февер Непреклонный aka &lt;span class='ljuser ljuser-name_udpn' lj:user='udpn' style='white-space: nowrap;'&gt;&lt;a href='http://udpn.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://udpn.livejournal.com/'&gt;&lt;b&gt;udpn&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; (Волжский, Волгоградская область)&lt;br /&gt;Томотом Бесшумный aka &lt;span class='ljuser ljuser-name_tomotom' lj:user='tomotom' style='white-space: nowrap;'&gt;&lt;a href='http://tomotom.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://tomotom.livejournal.com/'&gt;&lt;b&gt;tomotom&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; (Керчь)&lt;br /&gt;Брэнд Зоркий aka &lt;a href="http://darkbrand.spaces.live.com"&gt;darkbrand@live.com&lt;/a&gt; (Приазовский, Запорожская область)&lt;br /&gt;Дин Стремительный (Севастополь)&lt;br /&gt;&lt;br /&gt;Учитывая соотношение опрошенных/согласившихся (8/6), стало ясно, что на Южном берегу Крыма определенно намазано медом. Кроме этого, Томотома Бесшумного, по его словам, очень соблазнила перспектива посмотреть сезон 2.5 Теории Большого взрыва в прямом эфире :) В результате я (талантливо!) играл роль Шелдона, Shuffle стал Леонардом, Fever Воловицем, а сам Tom забрал себе роль Кутрапали.&lt;br /&gt;&lt;br /&gt;Изначально план экспедиции (как сейчас модно называть любую легкую прогулку — «этнографической экспедиции») являл собой концептуальный синтез последних веяний в области антинаучной фантастики и изобретательных суицидальных грез: например, путь от Артека до Фороса предлагалось проделать целиком пешком, а ночевать планировалось на Никитской и Ай-Петринской яйлах в палатке, предварительно взойдя туда под вечер. К счастью для участников, у автора всегда есть с кем проконсультироваться касательно пешего туризма, отчего палатки были исключены, а пешие переходы сильно урезаны в пользу колесного и канатного транспорта :) В дальнейшем отступлений от разработанного плана почти не было.&lt;br /&gt;&lt;br /&gt;Перед экспедицией автор люто заботился о наличии в составе группы хотя бы одного нормального фотоаппарата, так всех достав, что &lt;strike&gt;говно&lt;/strike&gt;зеркалки взяли аж три &lt;strike&gt;говно&lt;/strike&gt;фотографа, и только автор, кагдурак, поперся со своей мыльницей, которая за все время экспедиции так и не увидела белый свет. Несколько позже, правда, оказалось, что каждая из этих зеркалок живет в своем собственном времени, и сортировка их продукции после массового переименования по EXIF.DateOriginal выдает последовательность, по которой восстановить ход действий — совсем не легкая задача.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;День 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;15-го августа&lt;/b&gt;, утром, мы встретились на &lt;b&gt;Симферопольском ж/д вокзале&lt;/b&gt;, откуда постоянно отходят маршрутки, в том числе и в Гурзуф, начало нашей экспедиции. К этому времени прибывшие раньше Shuffle и Brand уже успели отщелкать пол-Симферополя, полюбоваться Салгиром и мостом замков. При посадке в транспорт автор изъял у Shuffle его девайс и принялся запечатлевать объективную реальность, вызванную отсутствием компьютера (на самом деле компьютер присутствовал, даже 2, но в рюкзаках). Ниже: фотография группы by Deen и фотография трассы, на которой можно заметить хребет Крымских гор и единственный в мире междугородний троллейбусный маршрут Симферополь-Ялта.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005hwfb"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005hwfb/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0005k3ey"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005k3ey/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Первая вещь, оказавшаяся неожиданной для жителей равнинных городов, сразу бросившаяся в глаза, как только мы спешились в &lt;b&gt;Гурзуфе&lt;/b&gt;, это то, что на ЮБК ровное место только одно — море. Все улочки, тропинки, дороги и трассы это сплошной серпантин, холмы и впадины, склоны и обрывы. При чем для экономии драгоценной земли строения стоят почти вплотную, что порождает очень узкие и очень кривые удивительные улицы, оценить красоту которых, увы, мешают набившиеся, словно кильки в консервной банке, полуголые отдыхающие (медом для них намазано, что ли?).&lt;br /&gt;&lt;br /&gt;Мы спустились к набережной и пошли вдоль пляжа. Вопреки ожиданиям, в море было, где вынырнуть, но, наверно, в большей степени из-за того, что полоса пляжа была узковата, чтобы вместить всех, кто ныряет, на суше. При этом некоторые граждане не теряют времени на ныряния, а настойчиво стремятся то ли поменять расу, то ли заработать меланому. С набережной, если, наконец, пройти мимо многочисленных ларьков с сувенирами, открывается замечательный вид на гору Аюдаг и скалы Адалары, панораму которых (а после и наши физиономии на их фоне) не забыл запечатлеть Brand.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005p3xb"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005p3xb/t7d2b" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0005q1h3"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005q1h3/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В Гурзуфе прямо на улице растут пальмы (самые настоящие!). Shuffle их видел, похоже, только на валлпаперах, иначе чем объяснить тот факт, что ему пришлось напоминать их сфотографировать? :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005r6et"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005r6et/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Пройдя всю набережную мы вознамерились подняться к трассе и остановке по довольно короткому маршруту (на карте так и вовсе пара сантиметров было — сущий пустяк!). Но восхождение как-то затянулось (да и шло не по городской местности, а больше мимо дач всякого ворья) и примерно через полтора часа полудохлый Sharp уговорил полудохлого Shuffle достать свой eeePC и опробовать в действии купленный специально для экспедиции GPS-донгл. Взгляните на эти веселые лица на фотографии: что же может быть радостнее, чем обнаружить, что мы прошли дальше по набережной и поднимаемся к трассе по втрое более длинной дороге?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005twt9"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005twt9/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Между тем незадолго до трассы удалось обнаружить замечательную обзорную площадку с отличным видом на Гурзуф (как пишут плохие журналисты, утопающий в зелени), заснять несколько панорам и насмотреться в тридцатикратный бинокль, который автор все же не зря тащил. Подъем был впечатляющ, и фраза «вверх, как у Гурзуфа» в контексте «вот сейчас» еще некоторое время пользовалась популярностью :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005srz9"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005srz9/t7d20" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0005wr6z"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005wr6z/t7d2b" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0005xg26"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005xg26/t7d3a" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Поймав маршрутку, мы доехали до &lt;b&gt;Никитского ботанического сада&lt;/b&gt;. Стоит заметить, что от остановки и колонн с надписью вниз еще порядочно топать, но это неудобство отчасти компенсируется тем, что вниз — не вверх, и видами, которые при этом открываются.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0005y1e2"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005y1e2/t7d31" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В самом Никитском саду весьма любопытно: большое количество всяких красочных растений и долгожданная тень от деревьев. Примерно в начале спуска по саду стоит дворец с бассейном и памятник Ленину, Стевену (основателю сада) и прочим хорошим людям. В бамбуковой роще царит почти полная темнота, изредка озаряемая фотовспышками, направленными на высших приматов, которые вдруг решили вспомнить свое нелегкое прошлое дриопитека (на фотографии изображен прореженный бамбуковый лесной массив).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/00063yr5"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00063yr5/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00061exf"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00061exf/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0005z9c6"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0005z9c6/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00060c3w"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00060c3w/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/000626bp"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000626bp/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00065rwd"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00065rwd/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00066pcg"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00066pcg/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/000678zk"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000678zk/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00064de3"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00064de3/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Помимо растительности, были замечены пруды с живностью, в частности, весьма живописными черными и оранжевыми рыбками и здоровенным раком. Недалеко от финиша маршрута по Никитскому саду растет неопознанное шестью ботаниками экспедиции дерево, обхват которого столь велик, что шесть ботаников экспедиции едва ли смогут его обхватить. Мы не смогли не воспользоваться случаем и не обсудить перспективы пуска БАК на полную светимость :)&lt;br /&gt;&lt;br /&gt;Прогуливавшаяся женщина с внуком, судя по всему, однозначный фанат Никитского сада, рассказала нам, что это дерево — патриарх сада: она ходила сюда еще со своим дедом, затем с матерью, потом с сыном, а теперь вот со внуком, а дерево все такое же, пережило минимум 4 поколения. От «теперь вот» запахло неиллюзорным черным юмором, но совсем комичной ситуация стала, когда она попрощалась с нами и позвала внука: «Пойдем, Никита».&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/00068bhz"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00068bhz/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В &lt;b&gt;Ялту&lt;/b&gt; мы приехали уже вечером. К несчастью, обещанных многочисленных бабушек, которые сдают квартиры, на автовокзале не оказалось, но проблема решилась благодаря палатке, мужик из которой устроил нас в пансионат «Парковый». Получилось несколько дороже, чем мы ожидали, и сильно дальше от центра, зато здание оказалось электрифицированным, с 5-метровыми орнаментированными потолками и неплохим видом на ночную Ялту, что, конечно, существенно лучше палатки. И ботаны приступили вершить свои черные дела. Во-первых, следовало обменяться электронными библиотеками, которых Fever привез 430 гигабайт, а Shuffle 80. Во-вторых, следовало реализовать одну чудесную идею, которая в разное время называлась то pQuery (procedural query), то fQuery (functional query).&lt;br /&gt;&lt;br /&gt;В jQuery, служившем прототипом, преобразования, осуществляемые над DOM-элементами из одного запроса, можно осуществлять цепочкой. Перед нами встала грандиозная задача записывать цепочкой произвольный dataflow. Для этого (создания произвольного связного орграфа с вершинами-функциями и ребрами-данными) было решено в цепочку добавить вызовы функций connect и back (позже: link с bool-параметром), которые перемещали в вершину, отстоящую по текущему пройденному пути на N вершин назад, и проводили или нет туда ориентированное ребро. Легко доказать, что таким образом можно построить произвольный орграф. Для примера вот как в такой форме записывается diamond graph: A.B1.C.link(2, false).B2.link(2, true). Весь вечер ушел на то, чтобы написать каркас для динамического pQuery, так что на статический уже не хватило сил :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/00069675"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00069675/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;День 2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;С утра мы отправились к &lt;b&gt;Ливадийскому дворцу&lt;/b&gt;, попутно обсуждая, что нужно простому парню вроде автора, чтобы построить огромных восьмиметровых суператомных роботов, чтобы уничтожить все живое на Земле: оказалось, что Deen и Fever хорошо разбираются в электронике и микроконтроллерах. Изначально планировалось посетить еще и Массандровский дворец, но по необъяснимой причине группа стихийно ринулась на &lt;b&gt;Солнечную тропу&lt;/b&gt;. К счастью, небо услышало наши молитвы, и весь день было довольно облачно, поэтому восхождение у Гурзуфа не повторилось.&lt;br /&gt;&lt;br /&gt;Следует сделать лирическое отступление и упомянуть, что по ЮБК ходит сказочное количество кошек, что, безусловно, свидетельствует в пользу светлоджедайной ауры этого места, но очень отвлекало наших фотографов. Выяснилось к тому же, что кошки обожают позировать, правда, осталось сокрытым мраком, ожидали ли они за работу моделью кусок колбасы. Поскольку я оставил свои запасы в пансионате (а у Fever'а в рюкзаке было одно бухло и курево!), ни одно грациозное создание, увы, поощрено не было. Фотки дворца, грациозного создания на фоне возможной причины их изобилия и начала Солнечной тропы прилагаются.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006aq1s"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006aq1s/t7d27" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006debc"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006debc/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006ecas"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006ecas/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006c16g"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006c16g/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Переходя асфальтированную дорогу, мы не заметили продолжения тропы и наивно посчитали таковой дорогу. Дорога таковой не являлась и через несколько километров без поворотов и даже тропок привела нас к частному пансионату, где нас безжалостно завернули назад. Сумасшедший ботан на фотографии какбе намекает: путь закрыт, и мертвые хранят его!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006bcwz"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006bcwz/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вернувшись в Ливадию, мы спустились на галечный пляж на двух лифтах. По пути мы встретили двух возвращавшихся с пляжа молодых людей, по виду настоящих братков, которые очень душевно и с прочувствованной настоящей любовью к своей профессии напевали бессмертный хит репера Сявы: «Чо, чо! Оп-па, ни$$я!», что нас несказанно возрадовало. В конце спуска жаждавший искупаться Shuffle получил такую возможность. Я же устроился неподалеку и принялся коварно ждать, наблюдая за чайками и многочисленными вертолетами, рассекающими небо в поисках добычи. Менее чем через полчаса Tom и Shuffle сообщили автору о его мудрости: вода, как и предвидел Шелдон, была холодная до ужаса.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006fyfs"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006fyfs/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Затем мы отправились на &lt;b&gt;набережную Ялты&lt;/b&gt;, заглянув по дороге в какое-то кафе, где как следует обсудили РЖД, где работает Shuffle, и степень турбулентности потоков воздуха в пепельницах обнаруженной там конфигурации. Следует заметить, что набережная Ялты заселена прохожими еще гуще, чем узкие улочки Гурзуфа. При этом, что печалит душу автора, гастроном на этой набережной, где можно пополнить запасы &lt;strike&gt;тормозной&lt;/strike&gt; питьевой жидкости, всего один, зато совершенно бесполезных ювелирных салонов — хоть отбавляй. В кафе мы, конечно, не наелись, но, к счастью, Deen знал нычку с пиццей. Между делом мы померились тем, чем обычно меряются, и оказалось, что у Deen'а длиннее — он работает в Sun :).&lt;br /&gt;&lt;br /&gt;Ближе к берегу и ближе к вечеру людей стало немного меньше, зато фонтанов с разноцветной подсветкой, теплоходов и огней набережной стало больше, что надлежащим образом зафиксировано.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006g9d8"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006g9d8/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006hyk1"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006hyk1/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006kzt5"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006kzt5/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Мы вдоволь посидели недалеко от парка на набережной и пообсуждали беспощадное исключение концептов из C++0x, Iterators must go и прочие занимательные вещи. А Shuffle загорелся идеей реализовать оператор [], как в C#, то есть с запятыми и БШ, чем они с Fever'ом и занимались весь вечер, делая компилятор счастливым. На фотографии видны два можжевеловых шара, которые я и Fever приобрели в личное пользование, дабы не забыть о том, что мы были на ЮБК, пока не появится этот пост.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006p1zg"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006p1zg/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;День 3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Утром мы поехали к автовокзалу в поисках транспорта, который бы отвез нас в Мисхор, к нижней точке канатной дороги: планировалось подняться и спуститься на ней. Вместо этого нам предложили за те же деньги заехать на &lt;b&gt;Ай-Петри&lt;/b&gt; по знаменитому &lt;b&gt;Ай-Петринскому шоссе&lt;/b&gt;, и это предложение вызвало в наших сердцах энтузиазм. По дороге мы имели возможность лицезреть &lt;b&gt;Учан-Су&lt;/b&gt;, который в дождливое время года превращается в самый красивый и самый высокий в Украине водопад, а во время нашей экспедиции представлял собой жалкий высохший ручеек. Говорят, он где-то здесь, на этом фото.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006q42r"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006q42r/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ай-Петринское шоссе примечательно тем, что имеет просто невероятное количество поворотов, и через несколько километров по нему начинается нешуточный приступ морской болезни. На фотографии изображен самый длинный прямой участок этого шоссе и красивый вид вниз на Ялту, который какбе намекает, сколько минут лететь, если не вписаться в поворот. Групповая фотография в районе &lt;b&gt;Серебряной беседки&lt;/b&gt; также прилагается.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006r9bc"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006r9bc/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006t3zd"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006t3zd/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006ss71"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006ss71/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;А на следующем шпионском кадре вовсе не башни Крымской астрофизической обсерватории, которая находится севернее, в поселке Научный, а &lt;b&gt;станция космического слежения&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006wdkc"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006wdkc/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вид с &lt;b&gt;Ай-Петринской яйлы&lt;/b&gt; открывается поистине замечательный: отвесные скальные стены, и далеко внизу, в добром десятке километров, окутанная голубой дымкой, Ялта. Скалы кажутся покрытыми мхом, но на самом деле это огромные деревья: превосходный вид для бинокля. Сама яйла напоминает привычную керченскому глазу лесостепь, неожиданными оказались только разбросанные повсюду мины, которыми изобильно осыпают землю просто таки повсюду водящиеся здесь животные. Мы не будем их показывать :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0006xh1d"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006xh1d/t7d1b" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006yfqx"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006yfqx/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0006zx36"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0006zx36/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00070b5x"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00070b5x/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Неподалеку от точки нашего обзора находится &lt;b&gt;пещера Трехглазка&lt;/b&gt; вертикального типа, названная так из-за ведущих туда трех колодцев, через один из которых проложена пешеходная, но очень крутая лестница. На входе стоит впечатляющая очередь, и увековеченный Ильфом и Петровым Пятигорский провал был упомянут просто неприличное количество раз. Внутри пещеры очень холодно: снег, попадающий туда через колодцы, не тает до конца целый год, а под ногами находится ледяное озеро, на котором несколько человек даже навернулись, сойдя с резиновых тропинок. Конус снега под «глазом» почти целиком покрыт монетами отдыхающих, так что какой-нибудь предприимчивый гражданин с магнитом может без труда отбить стоимость входа в пещеру. В небольшом огороженном ущелье позже на фотографиях помимо многочисленных монет была обнаружена серого цвета человеческая рука, торчащая из-под камней. Ужас обуял наши сердца, когда мы представили себе хладный придавленный труп, но папа автора объяснил, что ниже пещеры есть дырка, через которую можно попробовать заработать, вытаскивая монеты, чем, видимо, и занимался обладатель запечатленной конечности.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/00071rrx"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00071rrx/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/000722ar"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000722ar/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00073rf6"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00073rf6/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00074af6"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00074af6/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/000757e0"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000757e0/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Знаменитые зубцы Ай-Петри охраняют многочисленные люди не славянской наружности, которые непременно желают, чтобы прохожий скушал что-нибудь из их довольно аппетитно выглядящих готовящихся тут же на месте ништяков. Однако автор владеет, наряду с нужным левелом артистичности, замечательным двойным заклинанием против подобной настойчивости: покорное «сколько?» в комбе с молниеносным «ого!».&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/000769y4"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000769y4/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00077aws"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00077aws/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На площадке перед зданием канатной дороги совершенно кошмарное количество людей: в очереди пришлось ждать почти 3 часа. Стоящие в очереди граждане постоянно подвергаются психическим атакам водителей, которые обещают быстро и с комфортом отвезти вниз. Fever сообщил о том, какую участь он планирует стоящим впереди нас, и участь эта была черна, как его душа. В ответ на такое автор сообщил ему, что это не по-коммунистически и не по-светлоджедайному, а значит, сии мысли недостойны нас. По-коммунистически, вещал автор, построить рядом еще одну канатную дорогу (с БШ, ага), снизив таким образом нагрузку на и без того изношенную линию, едва ли рассчитанную на эксплуатацию при капитализме. Экскурсоводу впередистоящей группы простая сермяжная правда неиллюзорно резала глаза, и она принялась спорить, однако свести спор к непременным сталинским палачам как-то не получилось, и дискуссия утихла.&lt;br /&gt;&lt;br /&gt;Спуск после трехчасовой очереди нас немного разочаровал, потому что трос прогибается весьма сильно, и движение идет сравнительно невысоко над землей, что особенно печально на второй половине пути, где дорога еле поднимается над верхушками деревьев. Но даже несмотря на это, черный юмор в кабинке преобладал :) Виды сверху и снизу прилагаются.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0007ahrs"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007ahrs/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/00079396"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/00079396/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/000786kg"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/000786kg/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0007b2sr"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007b2sr/t7d5d" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0007cebt"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007cebt/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0007dcky"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007dcky/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;После спуска мы немного отдохнули в беседке неподалеку и отправились в &lt;b&gt;Алупку&lt;/b&gt;. К сожалению, время начинало немного поджимать, и подробно осмотреть &lt;b&gt;Воронцовский дворец&lt;/b&gt; нам не удалось.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0007ek76"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007ek76/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0007f78a"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007f78a/t7d53" /&gt;&lt;/a&gt; &lt;a href="http://pics.livejournal.com/sharpc/pic/0007ghrt"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007ghrt/t7d53" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Но даже несмотря на спешку, на маршрутку до Симферополя мы все равно опоздали, и уезжать пришлось из Ялты. На этой фотографии Крым будто бы говорит нам: возвращайтесь, вы еще не посмотрели Массандру, Карадаг, Большой каньон Крыма, крымские пещеры, Бахчисарай и Севастополь! А мы, потирая мозоли, будто бы отвечаем: может, через год...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pics.livejournal.com/sharpc/pic/0007h8t4"&gt;&lt;img src="http://pics.livejournal.com/sharpc/pic/0007h8t4/t7d5d" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:50987</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/50987.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=50987"/>
    <title>Форматы времени</title>
    <published>2009-08-08T03:54:54Z</published>
    <updated>2009-08-08T03:54:54Z</updated>
    <category term="наука"/>
    <category term="программирование"/>
    <lj:music>Виктор Аргонов — [2032: Легенда о несбывшемся грядущем #15] 200 Минут</lj:music>
    <content type="html">Количество компьютерных форматов представления времени поражает всяческое воображение. Видимо ввиду древности возникновения задачи хранить момент времени, область полна архаики. Вкратце перечислю некоторые из решений (рассматриваем наиболее популярную 32-битную архитектуру):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://ru.wikipedia.org/wiki/UNIX-время"&gt;Unix time&lt;/a&gt;&lt;/b&gt; (POSIX-время, &lt;a href="http://www.cplusplus.com/reference/clibrary/ctime/time_t/"&gt;time_t&lt;/a&gt;) в 4 байтах хранит время в секундах, прошедшее с 1 января 1970 года, следовательно, может представлять время до 19 января 2038 года.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unix time 64&lt;/b&gt; — то же, что и предыдущее, только 64-битное. 8 байт, от 1 января 1970 года примерно 292 миллиарда лет.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://ru.wikipedia.org/wiki/Юлианский_день"&gt;Юлианские дни (JD)&lt;/a&gt;&lt;/b&gt; используется для указания дня в астрономии (для указания конкретного момента в дне используют дробную часть). Если ограничить его представление 4 байтами, он представит даты от полудня 1 января 4713 до н. э. примерно 12 миллионов лет. Именно эта дата была выбрана ввиду начала сразу нескольких неинтересных циклов и потому, что до нас не дошли упоминания о более ранних астрономических наблюдениях.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Модифицированные юлианские дни (MJD)&lt;/b&gt; используются для сокращения записи юлианских дней вычитанием 2400000.5, точкой отсчета становится ночь 17 ноября 1858 года.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.codenet.ru/progr/cpp/spr/030.php"&gt;BIOS-time&lt;/a&gt;&lt;/b&gt; измеряет время в тиках с частотой примерно 18.2&amp;nbsp;Гц с полуночи, занимает 4 байта.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.cplusplus.com/reference/clibrary/ctime/tm/"&gt;struct tm&lt;/a&gt;&lt;/b&gt; используется для представления человеко-читаемой даты в стандартной библиотеке C.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw4"&gt;struct&lt;/span&gt; &lt;span class="kw4"&gt;tm&lt;/span&gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_sec;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_min;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_hour;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_mday;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_mon;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_year;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_wday;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_yday;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; tm_isdst;&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;Таким образом, эта структура размером 36 байт может представить дату от 1 января 1900 (и еще 4 миллиарда лет) с точностью до 1 секунды.&lt;br /&gt;&lt;br /&gt;Радуют разнообразием форматы времени, используемые в Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx"&gt;GetTickCount&lt;/a&gt;&lt;/b&gt; возвращает 4-байтовое число, равное количеству миллисекунд, прошедших с момента включения компьютера, представляя интервал до 49.7 суток. &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724411(VS.85).aspx"&gt;GetTickCount64&lt;/a&gt;&lt;/b&gt; это ее 64-битный аналог, который позволяет представлять интервалы до 580 миллионов лет.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx"&gt;FILETIME&lt;/a&gt;&lt;/b&gt; это такой виндовый unix-time, только с БШ. БШ обеспечивается за счет 64-битности, позволяя указывать дату в 100-наносекундных интервалах, начиная с 1 января 1601 года на протяжении 58 тысяч лет.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724950(VS.85).aspx"&gt;SYSTEMTIME&lt;/a&gt;&lt;/b&gt; — БШ-tm от Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp"&gt;&lt;span class="kw4"&gt;struct&lt;/span&gt; SYSTEMTIME {&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wYear;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wMonth;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wDayOfWeek;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wDay;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wHour;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wMinute;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wSecond;&lt;br /&gt;&amp;nbsp; &amp;nbsp; WORD wMilliseconds;&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;Экономит на размере полей, поэтому занимает 16 байт, и представляет с секундной точностью время от 1601 года почему-то до 30827.&lt;br /&gt;&lt;br /&gt;Кроме вышеперечисленных бинарных форматов существуют текстовые, тысячи, тысячи их. Но еще один виндовый я все же упомяну:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa387237(VS.85).aspx"&gt;CIM_DATETIME&lt;/a&gt;&lt;/b&gt; — в формате yyyymmddHHMMSS.mmmmmmsUUU в 25 байтах представляющий с точностью 1 миллисекунда время от 0-го до 9999-го года.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Такое разнообразие страшно раздражает, и я задался вопросом, а нельзя ли как-нибудь решить эту проблему раз и навсегда?&lt;br /&gt;&lt;br /&gt;Отметим, что дискретизация самого точного представления (FILETIME), равная 100 наносекунд, совершенно недостаточна для представления длительности, скажем, фемтосекундных лазерных импульсов, которыми давно и успешно &lt;a href="http://www.gazeta.ru/2006/03/06/oa_191152.shtml"&gt;исследуют механизмы химических реакций&lt;/a&gt;, а диапазона самого «древнего» (JD) и самого «широкого» (tm) недостаточно для датировки древних горных пород или превращения Солнца в красного гиганта.&lt;br /&gt;&lt;br /&gt;Согласно принципу квантовой неопределенности и теории относительности, измерить время точнее &lt;a href="http://ru.wikipedia.org/wiki/Планковское_время"&gt;планковского времени&lt;/a&gt;, равного примерно 5.39x10&lt;sup&gt;&amp;minus;44&lt;/sup&gt; секунд, принципиально невозможно. Кроме того, время существования нашей Вселенной не превышает 13.85 миллиардов лет. Радостно делим одно на другое, берем двоичный логарифм и получаем, что хватит 203 бит. Округляем до 256 бит (32 байта, tm — и тот больше) и обнаруживаем, что любое обозримое событие и любой наблюдаемый интервал вполне может быть представлен таким числом.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Даешь 32-байтные таймстампы!!!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:sharpc:50890</id>
    <link rel="alternate" type="text/html" href="http://sharpc.livejournal.com/50890.html"/>
    <link rel="self" type="text/xml" href="http://sharpc.livejournal.com/data/atom/?itemid=50890"/>
    <title>Ужас библиотекаря</title>
    <published>2009-08-05T18:49:15Z</published>
    <updated>2009-08-05T18:49:15Z</updated>
    <category term="software"/>
    <category term="дыбр"/>
    <category term="книги"/>
    <lj:music>Dream Theater — [Images &amp; Words #01] Pull Me Under</lj:music>
    <content type="html">В детстве я мечтал стать библиотекарем. Тихо ходить меж молчаливых полок, заставленных знаниями, и чувствовать себя их властелином. Прочитать не все, но очень многое, и без сомнений тут же отвечать бойким детским глазам, ищущим интересных и умных книжек. Несколько раз в день заполнять формуляры, а остальное время в обнимку с лампой путешествовать по чудесным мирам, созданным чьим-то ярким воображением и пытливым любознательным умом. Я жаждал пробираться сквозь серые, потрепанные страницы и чувствовать в каждой восторг тех, кто прочитал ее до меня, и тех, кто прочитает ее после по моему совету.&lt;br /&gt;&lt;br /&gt;Однако практика мудрей, чем спор абстрактных идей. Расскажу о том ужасе, который кое-где приходится разгребать в моей небольшой полутерабайтовой библиотечке, в настоящее время переживающей одно из самых крупных своих слияний.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Нечего и говорить, что библиотека содержит потрясающее разнообразие форматов файлов. Помимо вполне логичных .txt, .pdf, .djvu/.djv, .doc, .chm, .ps, .rtf, .ppt, .tex, .odt попадаются ожидаемые .rar, .zip, .gz, .7z, .ha, .bz2, .tgz, неприятные .gif, .htm/.html/.phtml/.shtml/.mht/.mhtml, .jpg/.jpeg, .tif/.tiff, .bmp, .png, .js, .css, подозрительные .exe, .bat, .com, разнообразные .h, .cpp, .c, .class, .pas, .asm, .dsp, .java, .vcproj, .py, .dfm, .dpr, .pdb, .dsw, неизбежные .dir, .wd3, .diz, .me, .rus, .nfo, .lst, .readme... всего 1145 расширений :) Причем часто расширения не соответствуют типу документа, например в .php лежит скачанный с кривыми заголовками jpeg; встречаются и гибриды: например, .txt и .pdf с некстати выданным HTML-заголовком. При этом pdf часто еще и бьется из-за скачивания такого монстрика в текстовом формате вместо бинарного.&lt;br /&gt;&lt;br /&gt;Многие литературные единицы приходят разбитыми на страницы, что напрягает даже в случае, если это сканы конспектов (тут любовью пользуются jpeg и tiff), и напрягает несказанно, если это постранично разбитый pdf, потому что такой «документ» не промотаешь в Irfan View. Но и борьба с постраничной разбивкой порой ведется совсем уж беспощадно, от чего появляются стометровые pdf и doc с аккуратно засунутыми туда картинками (хорошо еще, если в нужном порядке). Несколько более простым, но по-прежнему жестоким способом является архивирование страниц в solid-архивы (от чего достать отдельную страницу без полной распаковки становится невозможным), которые (сюрприз!) все равно разбиваются на куски :) Отдельные экономящие винт товарищи перед загонкой страниц в архив упаковывают каждую аккуратно в .tar.gz. Радость была бы неполной, если бы дополнительно не упаковывался скомпилированный с вшитым интерпретатором самописный скрипт на Perl для удобного просмотра этих страниц.&lt;br /&gt;&lt;br /&gt;Общеизвестно, что Windows, в отличии от Unix, не любит некоторых символов в имени файла. Это порождает две, казалось бы, противоположные проблемы, которые (парадокс!) часто встречаются вместе.&lt;br /&gt;&lt;br /&gt;Первая заключается в том, что в стремлении к переносимости (или после самих переносов) имя файла становится написано lowercase-транслитом, символы препинания вырождаются в знаки подчеркивания, длина имени файла урезается до 8 букв, а расширение до 3. Понять, как назывался файл, не открывая его, становится невозможно. Встречавшиеся на пути книжки старые компьютеры тоже вносят свою лепту в упрощение чтения названия, и Содержание.doc становится SODERJ~1.DOC. Но не так страшен транслит, как его малюют, и поседевшие при встрече с файлом, названным графическим транслитом (pyKoBoDcTBo JIaMepa.txt тому пример), это охотно подтвердят.&lt;br /&gt;&lt;br /&gt;С другой стороны, порой мерами предосторожности пренебрегают, и появляются файлы, которые содержат имена из квадратиков или UTF-8. Бывает, имя файла оказывается безвозвратно утеряно, и только телепатия 7-го левела способна помочь понять, что ___ _____ __ ______ это «про аналы от васьки» (Литература по аналитической химии, скачанная у Василия).&lt;br /&gt;&lt;br /&gt;Попадаются коллекции, в которых именами файлов служат хэши (порой совершенно загадочные). Гораздо реже, чем хотелось бы, вместе с такими файлами идет их расшифровка в отдельном текстовом документе (и нередко в жутко запутанном формате).&lt;br /&gt;&lt;br /&gt;Но гораздо чаще названия просто неинформативны. Любой книголюб знает, что по ISBN-коду книги можно получить практически всю библиографическую информацию о книге (а в заметках у автора лежит примерно 30 ссылок сервисов (помимо гугла), которые обещают это сделать). А вот по названию Klyovaya_knigka_kachay!!!.djvu или неорга.djv довольно сложно догадаться, что внутре у ней учебник Ахметова.&lt;br /&gt;&lt;br /&gt;Отдельной истории заслуживают многочисленные сохранения веб-страниц. С одной стороны, они часто действительно содержат нужную информацию. Но с другой, разнообразие оформления, используемых скриптов и потерянных файлов порождает жуткую свалку, усугубляющуюся гиперссылочной природой HTML и путями. Отсутствие внятного стандарта на математические формулы в веб-текстах (одно время в качестве него продвигался MathML, но он справедливо не заслужил популярности ввиду своей жуткой безблагодатности) привело к тому, что в основном для их отображения используются картинки (этот блог не исключение — я использую картинки с сервиса l.wordpress.com, принимающий LaTeX-код, который я для удобства незрячих, отключивших картинки и роботов пишу заодно и в alt-атрибуте). К глубокому сожалению, моя аккуратность не так широко распространена, и поэтому в основном в формулах на веб-страницах используются гифы со сквозной нумерацией, скопированные из редактора формул Word. И хорошо, если еще гифы! По этой причине в моей библиотечке gif — самый распространенный формат, почти в 5 раз опережающий по этому показателю .djvu.&lt;br /&gt;&lt;br /&gt;Заслуживает внимания и разнобой в форматах архивов. Здесь, как и в случае с именованием файлов, тоже встречаются две крайности: кто-то ничтоже сумняшеся упаковывает файлы в .7z, а кто-то в стремлении к чему-то светлому (кроссплатформенности?!) создает самораспаковывающиеся архивы (exe), которые непременно на какой-нибудь машине подхватывают вирус. При чем часто, когда удается вывести антивирус из глубоких рассуждений, он лечит эти архивы, и заодно их портит :) В светлом стремлении к тому, чтобы пользователь легко нашел нужную ему информацию, в каждую папку архива обязательно помещается что-то из списка descript.ion, thumbs.db, file_id.diz, file.nfo, read.me и даже read_this_or_i_will_kill_you.txt и т.п., содержащее бесценные комментарии к контенту в стиле «Посетите наш порносайт!». К слову, несмотря на отчаянную борьбу автора с медиа-файлами (медиатека через дорогу! аудиокниг здесь не будет никогда!), однажды в какой-то глубоко зарытой папке читатели обнаружили порнуху :)&lt;br /&gt;&lt;br /&gt;Ко многим книгам по программированию прилагаются разные исходники и файлы проектов, часто уже кем-то заботливо скомпилированные. Все бы ничего, но это действие добавляет еще некоторое количество файлов, совершенно не несущее полезной информации для кого-либо, кроме компилятора.&lt;br /&gt;&lt;br /&gt;В благородном стремлении обеспечить потенциального читателя средством для просмотра предоставляемых материалов держатели библиотек вкладывают в самые потайные уголки своих библиотек самые разнообразные читалки форматов от djvu и pdf до fb2 и wrl самых разнообразных версий. Однажды автор выпилил уровня эдак с 10-го вложенности установленный Apache с PHP3, с их сырцами и документацией.&lt;br /&gt;&lt;br /&gt;Об уровнях вложенности разговор отдельный. Библиотеки копируются друг у друга многократно, каждый раз обзаводясь новым уровнем и названием. Хорошо еще, если название как-то отражает суть контента, например, п.п. ВТУФО 231, но все же чаще встречаются сакральные temp, 1, ы, _ и asdasd. Стоит упомянуть, что максимальная длина простого (не UNC) пути в Windows равна MAX_PATH = 260, что неминуемо приведет к проблемам с копированием/перемещением файлов, если какой-то шутник поместил файл по пути Альдольная конденсация и циклоприсоединение\Альдольная конденсация и циклоприсоединение\Альдольная конденсация и циклоприсоединение\Альдольная конденсация и циклоприсоединение\Альдольная конденсация и циклоприсоединение\Альдольная конденсация и циклоприсоединение.djvu.&lt;br /&gt;&lt;br /&gt;Часто для того, чтобы приобщиться к знаниям, надо продраться через кошмарную иерархию каталогов, найти невнятно названный разбитый на куски архив, собрать его, распаковать, выгрузить файлы в одну папку, найти индексный html, найти в нем ссылку на нужный документ, оттранслировать путь на локальную иерархию, найти непоследовательные одностраничные затаргзиппенные pdf, раскиданные по папкам, собрать и распаковать их, обнаружить там сканы рукописного конспекта с отвратительным почерком, разобрать почерк и вкурить в систему обозначений его носителя, после чего понять, что конспект писал идиот, плюнуть, грохнуть и пойти плакаться на форумы, нет ли у кого-нибудь методички по необходимой штуке, о которой в гугле целых два упоминания, оба из которых — плач таких же, как вы, горемык :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Все вышеперечисленное встречалось мне в разное время, в разных местах, в разных сочетаниях, но с неизменной изобретательностью злого гения. Однако прогресс неумолимо мчится вперед, и если кто-то может нахаляву подогнать абузоустойчивый сервер с примерно терабайтом места, все эти бесценные сокровища человеческого разума, потом и кровью отсортированные и разложенные по полочкам, станут общедоступны :)</content>
  </entry>
</feed>
