mirror of
https://github.com/AlekseyLobanov/AlekseyLobanov.github.io.git
synced 2026-01-11 20:52:01 +03:00
240 lines
44 KiB
HTML
240 lines
44 KiB
HTML
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class=no-js> <!--<![endif]--> <head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><title>Моё решение задачи 60</title><meta name=description content><meta name=viewport content="width=device-width"><link rel=stylesheet href=../../theme/css/normalize.css><link href="https://fonts.googleapis.com/css?family=Forum|Oswald|PT+Sans|Philosopher|Ubuntu+Mono" rel=stylesheet><link rel=stylesheet href=../../theme/css/font-awesome.min.css><link rel=stylesheet href=../../theme/css/main.css><link rel=stylesheet href=../../theme/css/blog.css><link rel=stylesheet href=../../theme/css/github.css><link href=https://likemath.ru/feeds/all.atom.xml type=application/atom+xml rel=alternate title="Блог 529 Atom Feed"><link href=https://likemath.ru/feeds/all.rss.xml type=application/rss+xml rel=alternate title="Блог 529 RSS Feed"><script src=../../theme/js/vendor/modernizr-2.6.2.min.js></script></head> <body> <!--[if lt IE 7]>
|
||
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
|
||
<![endif]--> <div id=wrapper> <header id=sidebar class=side-shadow> <hgroup id=site-header> <a id=site-title href=../..><h2><i class=icon-pencil></i> Блог 529</h2></a> <p id=site-desc> Project Euler и остальное </p> </hgroup> <nav> <ul id=nav-links> <li><a href=../../ >Главная</a></li> <li><a href=../../pages/projects.html>Мои проекты</a></li> <li><a href=../../pages/about.html>Об авторе</a></li> <li><a href=../../feeds/feed.atom.xml>Atom feed</a></li> </ul> </nav> <footer id=site-info> <p> Powered by Pelican. </p> </footer></header> <div id=post-container> <ol id=post-list> <li> <article class=post-entry> <header class=entry-header> <time class=post-time datetime=2015-07-17T17:40:00+03:00 pubdate> Пт 17 июля 2015 </time> <a href=../../posts/moio-reshenie-zadachi-60/ rel=bookmark><h1>Моё решение задачи 60</h1></a> </header> <section class=post-content> <p>Необходимо найти множество из пяти простых чисел с минимальной суммой такое, что после “склеивания” в любом порядке любых двух чисел из него тоже будет простое число. Здесь под процедурой “склеивания” чисел <span class=math>\(a\)</span> и <span class=math>\(b\)</span> подразумевается получения из <span class=math>\(a = \overline{a_1 a_2 \ldots a_n}\)</span> и <span class=math>\(b = \overline{b_1 b_2 \ldots b_m}\)</span> некоторого <span class=math>\(c\)</span> так, что <span class=math>\(c = \overline{a_1 a_2 \ldots a_n b_1 b_2 \ldots b_m}\)</span>.</p> <p>Полное условие можно найти <a href="https://projecteuler.net/problem=60">тут</a></p> <p>Для начала, можно понять, что непосредственный перебор “в лоб” слишком медленный и нужного результата не даст. Поэтому хочется уйти от, как мне кажется, не самого формализуемого условия к чему-то более простого, с чем проще работать. Давайте сначала поймём, какие вообще числа могут быть в одном множестве. Для этого достаточно перебрать все разбиения на два подчисла всех простых чисел. Это достаточно быстро, порядка <span class=math>\(O\left( N \right)\)</span> операций. Важно не забыть, что мы можем разбивать число <span class=math>\(p\)</span> только на <span class=math>\(\overline{p_1 p_2}\)</span>, между числами не может быть нулей! То есть если число 37 разбивается на 3 и 7, то 307 нет.</p> <p>Пусть мы получили набор таких разбиений, то есть набор пар вида <span class=math>\(\left( p, q \right)\)</span>. Давайте составим из них граф, где вершинки это простые числа, а ориентированное ребро из <span class=math>\(p\)</span> в <span class=math>\(q\)</span> означает, что есть пара <span class=math>\(\left( p, q \right)\)</span>. Из того, что порядок склеивания чисел произвольный сразу следует, что рассматриваемый граф должен быть неориентированным. Таким образом, все пары <span class=math>\(\left( p, q \right)\)</span> для которых нет пары <span class=math>\(\left( q, p \right)\)</span> необходимо выкинуть, а из оставшихся построить граф.</p> <p>Теперь задача стало гораздо понятнее: достаточно выбрать клику размера 5, что сумма значений её вершин минимальна. В общем случае, это достаточно ресурсоёмкая(как мне кажется) задача, но в реальном графе количество рёбер не слишком большое. В худшем случае, по теореме Турана, количество рёбер в графе лишь с одной такой кликой примерно на 10% меньше числа рёбер в полном графе.</p> <p>Непосредственно сам поиск такой клики можно реализовать тривиально. Ниже мой код на C++11 с использованием библиотеки Boost Graph Library (<span class=caps>BGL</span>).</p> <div class=highlight><pre><span class=code-line><span></span><span class=cp>#include</span> <span class=cpf><iostream></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><algorithm></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><vector></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><set></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><map></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><cstdint></span><span class=cp></span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf><boost/graph/adjacency_list.hpp></span><span class=cp></span></span>
|
||
<span class=code-line><span class=cp>#include</span> <span class=cpf>"primesieve.hpp"</span><span class=cp></span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>using</span> <span class=k>namespace</span> <span class=n>std</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=k>using</span> <span class=k>namespace</span> <span class=n>boost</span><span class=p>;</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>typedef</span> <span class=n>adjacency_list</span><span class=o><</span><span class=n>listS</span><span class=p>,</span> <span class=n>vecS</span><span class=p>,</span> <span class=n>undirectedS</span><span class=o>></span> <span class=n>Graph</span><span class=p>;</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span> </span>
|
||
<span class=code-line><span class=n>vector</span><span class=o><</span> <span class=n>T</span> <span class=o>></span> <span class=n>getDigs</span><span class=p>(</span><span class=n>T</span> <span class=n>num</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>T</span> <span class=o>></span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>while</span> <span class=p>(</span> <span class=n>num</span> <span class=o>!=</span> <span class=mi>0</span> <span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=n>res</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>num</span> <span class=o>%</span> <span class=mi>10</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>num</span> <span class=o>=</span> <span class=n>num</span> <span class=o>/</span> <span class=mi>10</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>reverse</span><span class=p>(</span><span class=n>res</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span><span class=n>res</span><span class=p>.</span><span class=n>end</span><span class=p>());</span></span>
|
||
<span class=code-line> <span class=k>return</span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span></span>
|
||
<span class=code-line><span class=n>T</span> <span class=n>getNum</span><span class=p>(</span><span class=k>const</span> <span class=n>vector</span><span class=o><</span><span class=n>T</span><span class=o>></span> <span class=o>&</span><span class=n>digs</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>T</span> <span class=n>res</span><span class=p>(</span><span class=mi>0</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>T</span> <span class=nf>cur_mult</span><span class=p>(</span><span class=mi>1</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=n>it</span> <span class=o>=</span> <span class=n>digs</span><span class=p>.</span><span class=n>rbegin</span><span class=p>();</span> <span class=n>it</span> <span class=o>!=</span> <span class=n>digs</span><span class=p>.</span><span class=n>rend</span><span class=p>();</span> <span class=o>++</span><span class=n>it</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>res</span> <span class=o>+=</span> <span class=o>*</span><span class=n>it</span> <span class=o>*</span> <span class=n>cur_mult</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>cur_mult</span> <span class=o>*=</span> <span class=n>T</span><span class=p>(</span><span class=mi>10</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>return</span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span></span>
|
||
<span class=code-line><span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=n>T</span><span class=p>,</span><span class=n>T</span><span class=o>></span> <span class=o>></span> <span class=n>getPrimePairs</span><span class=p>(</span><span class=n>T</span> <span class=n>prime</span><span class=p>,</span> <span class=n>set</span><span class=o><</span><span class=n>T</span><span class=o>></span> <span class=o>&</span><span class=n>primes</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=n>T</span><span class=p>,</span><span class=n>T</span><span class=o>></span> <span class=o>></span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>auto</span> <span class=n>digs</span> <span class=o>=</span> <span class=n>getDigs</span><span class=o><</span><span class=n>T</span><span class=o>></span><span class=p>(</span><span class=n>prime</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=kt>size_t</span> <span class=n>i</span> <span class=o>=</span> <span class=mi>1</span><span class=p>;</span> <span class=n>i</span> <span class=o><=</span> <span class=n>digs</span><span class=p>.</span><span class=n>size</span><span class=p>()</span> <span class=o>-</span> <span class=mi>1</span><span class=p>;</span> <span class=o>++</span><span class=n>i</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>T</span> <span class=n>q1</span> <span class=o>=</span> <span class=n>getNum</span><span class=p>(</span><span class=n>vector</span><span class=o><</span><span class=n>T</span><span class=o>></span><span class=p>(</span><span class=n>digs</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span> <span class=n>digs</span><span class=p>.</span><span class=n>begin</span><span class=p>()</span> <span class=o>+</span> <span class=n>i</span><span class=p>));</span></span>
|
||
<span class=code-line> <span class=n>T</span> <span class=n>q2</span> <span class=o>=</span> <span class=n>getNum</span><span class=p>(</span><span class=n>vector</span><span class=o><</span><span class=n>T</span><span class=o>></span><span class=p>(</span><span class=n>digs</span><span class=p>.</span><span class=n>begin</span><span class=p>()</span> <span class=o>+</span> <span class=n>i</span><span class=p>,</span> <span class=n>digs</span><span class=p>.</span><span class=n>end</span><span class=p>()));</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=p>(</span><span class=n>primes</span><span class=p>.</span><span class=n>find</span><span class=p>(</span><span class=n>q1</span><span class=p>)</span> <span class=o>!=</span> <span class=n>primes</span><span class=p>.</span><span class=n>end</span><span class=p>())</span></span>
|
||
<span class=code-line> <span class=o>&&</span> <span class=p>(</span><span class=n>primes</span><span class=p>.</span><span class=n>find</span><span class=p>(</span><span class=n>q2</span><span class=p>)</span> <span class=o>!=</span> <span class=n>primes</span><span class=p>.</span><span class=n>end</span><span class=p>())</span> <span class=o>&&</span> <span class=p>(</span><span class=n>digs</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>i</span><span class=p>)</span> <span class=o>!=</span> <span class=mi>0</span><span class=p>)</span> <span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>res</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>make_pair</span><span class=p>(</span><span class=n>q1</span><span class=p>,</span><span class=n>q2</span><span class=p>));</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>return</span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=c1>// removes all (p,q) that (p,q) in edges but (q,p) is not</span></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span></span>
|
||
<span class=code-line><span class=kt>void</span> <span class=n>delBadEdges</span><span class=p>(</span><span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=n>T</span><span class=p>,</span><span class=n>T</span><span class=o>></span> <span class=o>></span> <span class=o>&</span><span class=n>edges</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>map</span><span class=o><</span> <span class=kt>int64_t</span><span class=p>,</span> <span class=kt>int</span> <span class=o>></span> <span class=n>mults</span><span class=p>;</span> <span class=c1>// contains counts of p * q</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>p</span><span class=p>:</span> <span class=n>edges</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=kt>int64_t</span> <span class=n>key</span> <span class=o>=</span> <span class=n>p</span><span class=p>.</span><span class=n>first</span> <span class=o>*</span> <span class=n>p</span><span class=p>.</span><span class=n>second</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=n>mults</span><span class=p>.</span><span class=n>find</span><span class=p>(</span><span class=n>key</span><span class=p>)</span> <span class=o>!=</span> <span class=n>mults</span><span class=p>.</span><span class=n>end</span><span class=p>()</span> <span class=p>)</span></span>
|
||
<span class=code-line> <span class=n>mults</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>+=</span> <span class=mi>1</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>else</span></span>
|
||
<span class=code-line> <span class=n>mults</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=mi>1</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=n>T</span><span class=p>,</span><span class=n>T</span><span class=o>></span> <span class=o>></span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>p</span><span class=p>:</span> <span class=n>edges</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=kt>int64_t</span> <span class=n>key</span> <span class=o>=</span> <span class=n>p</span><span class=p>.</span><span class=n>first</span> <span class=o>*</span> <span class=n>p</span><span class=p>.</span><span class=n>second</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=n>mults</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>==</span> <span class=mi>2</span> <span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>res</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>p</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=c1>// edge (p,q) is already exists</span></span>
|
||
<span class=code-line> <span class=n>mults</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>swap</span><span class=p>(</span><span class=n>res</span><span class=p>,</span> <span class=n>edges</span><span class=p>);</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span> </span>
|
||
<span class=code-line><span class=n>set</span><span class=o><</span><span class=n>T</span><span class=o>></span> <span class=n>getUniqNums</span><span class=p>(</span><span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=n>T</span><span class=p>,</span><span class=n>T</span><span class=o>></span> <span class=o>></span> <span class=o>&</span><span class=n>edges</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>set</span><span class=o><</span><span class=n>T</span><span class=o>></span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>p</span><span class=p>:</span> <span class=n>edges</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=n>res</span><span class=p>.</span><span class=n>insert</span><span class=p>(</span><span class=n>p</span><span class=p>.</span><span class=n>first</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>res</span><span class=p>.</span><span class=n>insert</span><span class=p>(</span><span class=n>p</span><span class=p>.</span><span class=n>second</span><span class=p>);</span> </span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>return</span> <span class=n>res</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=k>template</span> <span class=o><</span><span class=k>class</span> <span class=nc>T</span><span class=o>></span></span>
|
||
<span class=code-line><span class=kt>void</span> <span class=n>getNeedSet</span><span class=p>(</span><span class=n>Graph</span> <span class=o>&</span><span class=n>g</span><span class=p>,</span> <span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span> <span class=n>st</span><span class=p>,</span><span class=kt>int</span> <span class=n>depth</span><span class=p>,</span> </span>
|
||
<span class=code-line> <span class=n>set</span><span class=o><</span><span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=o>></span> <span class=n>cur_set</span><span class=p>,</span> <span class=k>const</span> <span class=n>map</span><span class=o><</span><span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=p>,</span> <span class=n>T</span><span class=o>></span> <span class=o>&</span><span class=n>vert_prime</span><span class=p>,</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>set</span><span class=o><</span><span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=o>></span> <span class=o>></span> <span class=o>&</span><span class=n>v_out</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=k>auto</span> <span class=n>edges</span> <span class=o>=</span> <span class=n>out_edges</span><span class=p>(</span><span class=n>st</span><span class=p>,</span> <span class=n>g</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span> <span class=o>></span> <span class=n>adj_verts</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=n>e_it</span> <span class=o>=</span> <span class=n>edges</span><span class=p>.</span><span class=n>first</span><span class=p>;</span> <span class=n>e_it</span> <span class=o>!=</span> <span class=n>edges</span><span class=p>.</span><span class=n>second</span><span class=p>;</span> <span class=o>++</span><span class=n>e_it</span><span class=p>)</span></span>
|
||
<span class=code-line> <span class=n>adj_verts</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>target</span><span class=p>(</span><span class=o>*</span><span class=n>e_it</span><span class=p>,</span><span class=n>g</span><span class=p>));</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>prev_v</span><span class=p>:</span> <span class=n>cur_set</span><span class=p>)</span></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=n>find</span><span class=p>(</span><span class=n>adj_verts</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span> <span class=n>adj_verts</span><span class=p>.</span><span class=n>end</span><span class=p>(),</span> <span class=n>prev_v</span><span class=p>)</span> <span class=o>==</span> <span class=n>adj_verts</span><span class=p>.</span><span class=n>end</span><span class=p>()</span> <span class=p>)</span></span>
|
||
<span class=code-line> <span class=k>return</span><span class=p>;</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=n>cur_set</span><span class=p>.</span><span class=n>insert</span><span class=p>(</span><span class=n>st</span><span class=p>);</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=n>depth</span> <span class=o>==</span> <span class=mi>1</span> <span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>v_out</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>cur_set</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=k>return</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>v</span><span class=p>:</span> <span class=n>adj_verts</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=p>(</span><span class=n>vert_prime</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>v</span><span class=p>)</span> <span class=o><</span> <span class=n>vert_prime</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>st</span><span class=p>))</span> <span class=p>)</span></span>
|
||
<span class=code-line> <span class=k>continue</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>getNeedSet</span><span class=p>(</span><span class=n>g</span><span class=p>,</span><span class=n>v</span><span class=p>,</span><span class=n>depth</span> <span class=o>-</span> <span class=mi>1</span><span class=p>,</span> <span class=n>cur_set</span><span class=p>,</span> <span class=n>vert_prime</span><span class=p>,</span> <span class=n>v_out</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line><span class=kt>int</span> <span class=n>main</span><span class=p>(</span><span class=kt>int</span> <span class=n>argc</span><span class=p>,</span> <span class=kt>char</span> <span class=o>**</span><span class=n>argv</span><span class=p>)</span> <span class=p>{</span></span>
|
||
<span class=code-line> <span class=k>const</span> <span class=kt>int</span> <span class=n>MAX_VAL</span> <span class=o>=</span> <span class=mi>100000000</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=kt>long</span> <span class=o>></span> <span class=n>v_primes</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>primesieve</span><span class=o>::</span><span class=n>generate_primes</span><span class=p>(</span><span class=n>MAX_VAL</span><span class=p>,</span> <span class=o>&</span><span class=n>v_primes</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>set</span><span class=o><</span> <span class=kt>long</span> <span class=o>></span> <span class=n>s_primes</span><span class=p>(</span><span class=n>v_primes</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span> <span class=n>v_primes</span><span class=p>.</span><span class=n>end</span><span class=p>());</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=s>"Number of primes is "</span> <span class=o><<</span> <span class=n>v_primes</span><span class=p>.</span><span class=n>size</span><span class=p>()</span> <span class=o><<</span> <span class=n>endl</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>v_primes</span><span class=p>.</span><span class=n>clear</span><span class=p>();</span></span>
|
||
<span class=code-line></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span> <span class=kt>long</span><span class=p>,</span><span class=kt>long</span> <span class=o>></span> <span class=o>></span> <span class=n>all_edges</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>pr</span><span class=p>:</span> <span class=n>s_primes</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=k>auto</span> <span class=n>t_v</span> <span class=o>=</span> <span class=n>getPrimePairs</span><span class=p>(</span><span class=n>pr</span><span class=p>,</span> <span class=n>s_primes</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>copy</span><span class=p>(</span><span class=n>t_v</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span><span class=n>t_v</span><span class=p>.</span><span class=n>end</span><span class=p>(),</span><span class=n>back_inserter</span><span class=p>(</span><span class=n>all_edges</span><span class=p>));</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=s>"There are "</span> <span class=o><<</span> <span class=n>all_edges</span><span class=p>.</span><span class=n>size</span><span class=p>()</span> <span class=o><<</span> <span class=s>" edges"</span> <span class=o><<</span> <span class=n>endl</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>delBadEdges</span><span class=p>(</span><span class=n>all_edges</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=s>"After deleting bad edges: "</span> <span class=o><<</span> <span class=n>all_edges</span><span class=p>.</span><span class=n>size</span><span class=p>()</span> <span class=o><<</span> <span class=s>" edges"</span> <span class=o><<</span> <span class=n>endl</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=c1>// We only need this primes</span></span>
|
||
<span class=code-line> <span class=n>s_primes</span> <span class=o>=</span> <span class=n>getUniqNums</span><span class=p>(</span><span class=n>all_edges</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>map</span><span class=o><</span> <span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=p>,</span> <span class=kt>long</span> <span class=o>></span> <span class=n>vert_prime</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>map</span><span class=o><</span> <span class=kt>long</span><span class=p>,</span> <span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span> <span class=o>></span> <span class=n>prime_vert</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>Graph</span> <span class=n>g</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>pr</span><span class=p>:</span> <span class=n>s_primes</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>vert_prime</span><span class=p>[</span><span class=n>add_vertex</span><span class=p>(</span><span class=n>g</span><span class=p>)]</span> <span class=o>=</span> <span class=n>pr</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>v</span><span class=p>:</span> <span class=n>vert_prime</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>prime_vert</span><span class=p>[</span><span class=n>v</span><span class=p>.</span><span class=n>second</span><span class=p>]</span> <span class=o>=</span> <span class=n>v</span><span class=p>.</span><span class=n>first</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>p</span><span class=p>:</span> <span class=n>all_edges</span><span class=p>)</span></span>
|
||
<span class=code-line> <span class=n>add_edge</span><span class=p>(</span><span class=n>prime_vert</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>p</span><span class=p>.</span><span class=n>first</span><span class=p>),</span><span class=n>prime_vert</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>p</span><span class=p>.</span><span class=n>second</span><span class=p>),</span><span class=n>g</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=k>auto</span> <span class=n>all_vertices</span> <span class=o>=</span> <span class=n>vertices</span><span class=p>(</span><span class=n>g</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>set</span><span class=o><</span><span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=o>></span> <span class=o>></span> <span class=n>goods</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=n>v_it</span> <span class=o>=</span> <span class=n>all_vertices</span><span class=p>.</span><span class=n>first</span><span class=p>;</span> <span class=n>v_it</span> <span class=o>!=</span> <span class=n>all_vertices</span><span class=p>.</span><span class=n>second</span><span class=p>;</span> <span class=o>++</span><span class=n>v_it</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>getNeedSet</span><span class=p>(</span><span class=n>g</span><span class=p>,</span> <span class=o>*</span><span class=n>v_it</span><span class=p>,</span><span class=mi>5</span><span class=p>,</span> <span class=n>set</span><span class=o><</span><span class=n>Graph</span><span class=o>::</span><span class=n>vertex_descriptor</span><span class=o>></span><span class=p>(),</span> <span class=n>vert_prime</span><span class=p>,</span> <span class=n>goods</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>vector</span><span class=o><</span> <span class=n>pair</span><span class=o><</span><span class=kt>size_t</span><span class=p>,</span> <span class=kt>size_t</span><span class=o>></span> <span class=o>></span> <span class=n>good_sums</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=kt>size_t</span> <span class=n>i</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span> <span class=n>i</span> <span class=o><</span> <span class=n>goods</span><span class=p>.</span><span class=n>size</span><span class=p>();</span> <span class=o>++</span><span class=n>i</span><span class=p>){</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=s>"Good set #"</span> <span class=o><<</span> <span class=n>i</span><span class=o>+</span><span class=mi>1</span> <span class=o><<</span> <span class=s>": "</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=kt>size_t</span> <span class=n>cur_sum</span> <span class=o>=</span> <span class=mi>0</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>for</span> <span class=p>(</span><span class=k>auto</span> <span class=nl>el</span><span class=p>:</span> <span class=n>goods</span><span class=p>[</span><span class=n>i</span><span class=p>]){</span></span>
|
||
<span class=code-line> <span class=n>el</span> <span class=o>=</span> <span class=n>vert_prime</span><span class=p>.</span><span class=n>at</span><span class=p>(</span><span class=n>el</span><span class=p>);</span></span>
|
||
<span class=code-line> <span class=n>cur_sum</span> <span class=o>+=</span> <span class=n>el</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=n>el</span> <span class=o><<</span> <span class=s>" "</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=n>endl</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=n>good_sums</span><span class=p>.</span><span class=n>push_back</span><span class=p>(</span><span class=n>make_pair</span><span class=p>(</span><span class=n>cur_sum</span><span class=p>,</span> <span class=n>i</span><span class=p>));</span></span>
|
||
<span class=code-line> <span class=p>}</span></span>
|
||
<span class=code-line> <span class=k>if</span> <span class=p>(</span> <span class=o>!</span><span class=n>good_sums</span><span class=p>.</span><span class=n>empty</span><span class=p>()</span> <span class=p>)</span></span>
|
||
<span class=code-line> <span class=n>cout</span> <span class=o><<</span> <span class=s>"Result is "</span> <span class=o><<</span> <span class=n>min_element</span><span class=p>(</span><span class=n>good_sums</span><span class=p>.</span><span class=n>begin</span><span class=p>(),</span><span class=n>good_sums</span><span class=p>.</span><span class=n>end</span><span class=p>(),</span> <span class=p>[](</span><span class=n>pair</span><span class=o><</span><span class=kt>size_t</span><span class=p>,</span> <span class=kt>size_t</span><span class=o>></span> <span class=n>a</span><span class=p>,</span> <span class=n>pair</span><span class=o><</span><span class=kt>size_t</span><span class=p>,</span> <span class=kt>size_t</span><span class=o>></span> <span class=n>b</span><span class=p>){</span><span class=k>return</span> <span class=n>a</span><span class=p>.</span><span class=n>first</span> <span class=o><</span> <span class=n>b</span><span class=p>.</span><span class=n>first</span><span class=p>;})</span><span class=o>-></span><span class=n>first</span> <span class=o><<</span> <span class=n>endl</span><span class=p>;</span></span>
|
||
<span class=code-line> <span class=k>return</span> <span class=mi>0</span><span class=p>;</span></span>
|
||
<span class=code-line><span class=p>}</span></span>
|
||
</pre></div> <p>Ответ: <strong>26033</strong></p> <p><strong><span class=caps>UPD</span>.</strong> Кажется, <code>getNeedSet</code> можно было реализовать гораздо проще, использую <span class=caps>BGL</span> посетителей (Visitors). Но, к сожалению, на этапе написания кода я про это забыл.</p> <script type=text/javascript>if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
|
||
var align = "center",
|
||
indent = "0em",
|
||
linebreak = "false";
|
||
|
||
if (false) {
|
||
align = (screen.width < 768) ? "left" : align;
|
||
indent = (screen.width < 768) ? "0em" : indent;
|
||
linebreak = (screen.width < 768) ? 'true' : linebreak;
|
||
}
|
||
|
||
var mathjaxscript = document.createElement('script');
|
||
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
|
||
mathjaxscript.type = 'text/javascript';
|
||
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
|
||
|
||
var configscript = document.createElement('script');
|
||
configscript.type = 'text/x-mathjax-config';
|
||
configscript[(window.opera ? "innerHTML" : "text")] =
|
||
"MathJax.Hub.Config({" +
|
||
" config: ['MMLorHTML.js']," +
|
||
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
|
||
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
|
||
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
|
||
" displayAlign: '"+ align +"'," +
|
||
" displayIndent: '"+ indent +"'," +
|
||
" showMathMenu: true," +
|
||
" messageStyle: 'normal'," +
|
||
" tex2jax: { " +
|
||
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
|
||
" displayMath: [ ['$$','$$'] ]," +
|
||
" processEscapes: true," +
|
||
" preview: 'TeX'," +
|
||
" }, " +
|
||
" 'HTML-CSS': { " +
|
||
" availableFonts: ['STIX', 'TeX']," +
|
||
" preferredFont: 'STIX'," +
|
||
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
|
||
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
|
||
" }, " +
|
||
"}); " +
|
||
"if ('default' !== 'default') {" +
|
||
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
|
||
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
|
||
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
|
||
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
|
||
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
|
||
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
|
||
"});" +
|
||
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
|
||
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
|
||
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
|
||
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
|
||
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
|
||
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
|
||
"});" +
|
||
"}";
|
||
|
||
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
|
||
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
|
||
}
|
||
</script> </section> <hr> <aside class=post-meta> <p>Категория: <a href=../../category/project-euler.html>Project Euler</a></p> <p>Теги: <a href=../../tag/project-euler.html>Project Euler</a>, <a href=../../tag/c.html>c++</a>, <a href=../../tag/bgl.html>BGL</a>, </p> </aside> <hr> </article> </li> </ol> </div> </div> <script type=text/javascript>
|
||
var _paq = _paq || [];
|
||
_paq.push(['trackPageView']);
|
||
_paq.push(['enableLinkTracking']);
|
||
(function() {
|
||
var u="https://piwik.likemath.ru/";
|
||
_paq.push(['setTrackerUrl', u+'piwik.php']);
|
||
_paq.push(['setSiteId', '1']);
|
||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
|
||
})();
|
||
</script> <script src=../../theme/js/main.js></script> </body> </html> |