Files
likemath.ru/posts/moio-reshenie-zadachi-60/index.html

301 lines
46 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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='http://fonts.googleapis.com/css?family=Philosopher&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Forum&subset=cyrillic' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Oswald' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Ubuntu+Mono' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=PT+Sans' rel='stylesheet' type='text/css'>
<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="http://likemath.ru/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Блог 529 Atom Feed" />
<link href="http://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-coffee"></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/about.html">Об авторе</a></li>
<li><a href="../../pages/projects.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>Моё решение задачи&nbsp;60</h1></a>
</header>
<section class="post-content">
<p>Необходимо найти множество из пяти простых чисел с минимальной суммой такое, что после &#8220;склеивания&#8221; в любом порядке любых двух чисел из него тоже будет простое число. Здесь под процедурой &#8220;склеивания&#8221; чисел <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>Для начала, можно понять, что непосредственный перебор &#8220;в лоб&#8221; слишком медленный и нужного результата не даст. Поэтому хочется уйти от, как мне кажется, не самого формализуемого условия к чему-то более простого, с чем проще работать. Давайте сначала поймём, какие вообще числа могут быть в одном множестве. Для этого достаточно перебрать все разбиения на два подчисла всех простых чисел. Это достаточно быстро, порядка <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&nbsp;нет.</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> необходимо выкинуть, а из оставшихся построить&nbsp;граф.</p>
<p>Теперь задача стало гораздо понятнее: достаточно выбрать клику размера 5, что сумма значений её вершин минимальна. В общем случае, это достаточно ресурсоёмкая(как мне кажется) задача, но в реальном графе количество рёбер не слишком большое. В худшем случае, по теореме Турана, количество рёбер в графе лишь с одной такой кликой примерно на 10% меньше числа рёбер в полном&nbsp;графе.</p>
<p>Непосредственно сам поиск такой клики можно реализовать тривиально. Ниже мой код на C++11 с использованием библиотеки Boost Graph Library (<span class="caps">BGL</span>).</p>
<div class="highlight"><pre><span class="code-line"><span class="cp">#include &lt;iostream&gt;</span></span>
<span class="code-line"><span class="cp">#include &lt;algorithm&gt;</span></span>
<span class="code-line"><span class="cp">#include &lt;vector&gt;</span></span>
<span class="code-line"><span class="cp">#include &lt;set&gt;</span></span>
<span class="code-line"><span class="cp">#include &lt;map&gt;</span></span>
<span class="code-line"><span class="cp">#include &lt;cstdint&gt;</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="cp">#include &lt;boost/graph/adjacency_list.hpp&gt;</span></span>
<span class="code-line"><span class="cp">#include &quot;primesieve.hpp&quot;</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">&lt;</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">&gt;</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span> </span>
<span class="code-line"><span class="n">vector</span><span class="o">&lt;</span> <span class="n">T</span> <span class="o">&gt;</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">&lt;</span> <span class="n">T</span> <span class="o">&gt;</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</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">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&amp;</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span></span>
<span class="code-line"><span class="n">vector</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&gt;</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">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&amp;</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">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&gt;</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">&lt;</span><span class="n">T</span><span class="o">&gt;</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">&lt;=</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">&lt;</span><span class="n">T</span><span class="o">&gt;</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">&lt;</span><span class="n">T</span><span class="o">&gt;</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">&amp;&amp;</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">&amp;&amp;</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</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">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">edges</span><span class="p">){</span></span>
<span class="code-line"> <span class="n">map</span><span class="o">&lt;</span> <span class="kt">int64_t</span><span class="p">,</span> <span class="kt">int</span> <span class="o">&gt;</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="n">p</span><span class="o">:</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">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&gt;</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="n">p</span><span class="o">:</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span> </span>
<span class="code-line"><span class="n">set</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="n">getUniqNums</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="n">T</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">edges</span><span class="p">){</span></span>
<span class="code-line"> <span class="n">set</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</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="n">p</span><span class="o">:</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">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</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">&amp;</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">&lt;</span><span class="n">Graph</span><span class="o">::</span><span class="n">vertex_descriptor</span><span class="o">&gt;</span> <span class="n">cur_set</span><span class="p">,</span> <span class="k">const</span> <span class="n">map</span><span class="o">&lt;</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">&gt;</span> <span class="o">&amp;</span><span class="n">vert_prime</span><span class="p">,</span></span>
<span class="code-line"> <span class="n">vector</span><span class="o">&lt;</span> <span class="n">set</span><span class="o">&lt;</span><span class="n">Graph</span><span class="o">::</span><span class="n">vertex_descriptor</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="o">&amp;</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">&lt;</span> <span class="n">Graph</span><span class="o">::</span><span class="n">vertex_descriptor</span> <span class="o">&gt;</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="n">prev_v</span><span class="o">:</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="n">v</span><span class="o">:</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">&lt;</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">&lt;</span> <span class="kt">long</span> <span class="o">&gt;</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">&amp;</span><span class="n">v_primes</span><span class="p">);</span></span>
<span class="code-line"> <span class="n">set</span><span class="o">&lt;</span> <span class="kt">long</span> <span class="o">&gt;</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">&lt;&lt;</span> <span class="s">&quot;Number of primes is &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">v_primes</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</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">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span> <span class="kt">long</span><span class="p">,</span><span class="kt">long</span> <span class="o">&gt;</span> <span class="o">&gt;</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="n">pr</span><span class="o">:</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">&lt;&lt;</span> <span class="s">&quot;There are &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">all_edges</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; edges&quot;</span> <span class="o">&lt;&lt;</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">&lt;&lt;</span> <span class="s">&quot;After deleting bad edges: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">all_edges</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; edges&quot;</span> <span class="o">&lt;&lt;</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">&lt;</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">&gt;</span> <span class="n">vert_prime</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">map</span><span class="o">&lt;</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">&gt;</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="n">pr</span><span class="o">:</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="n">v</span><span class="o">:</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="n">p</span><span class="o">:</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">&lt;</span> <span class="n">set</span><span class="o">&lt;</span><span class="n">Graph</span><span class="o">::</span><span class="n">vertex_descriptor</span><span class="o">&gt;</span> <span class="o">&gt;</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">&lt;</span><span class="n">Graph</span><span class="o">::</span><span class="n">vertex_descriptor</span><span class="o">&gt;</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">&lt;</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">size_t</span><span class="p">,</span> <span class="kt">size_t</span><span class="o">&gt;</span> <span class="o">&gt;</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">&lt;</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">&lt;&lt;</span> <span class="s">&quot;Good set #&quot;</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;: &quot;</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="n">el</span><span class="o">:</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">&lt;&lt;</span> <span class="n">el</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</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">&lt;&lt;</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">&lt;&lt;</span> <span class="s">&quot;Result is &quot;</span> <span class="o">&lt;&lt;</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">&lt;</span><span class="kt">size_t</span><span class="p">,</span> <span class="kt">size_t</span><span class="o">&gt;</span> <span class="n">a</span><span class="p">,</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">size_t</span><span class="p">,</span> <span class="kt">size_t</span><span class="o">&gt;</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">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">first</span><span class="p">;})</span><span class="o">-&gt;</span><span class="n">first</span> <span class="o">&lt;&lt;</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). Но, к сожалению, на этапе написания кода я про это&nbsp;забыл.</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
mathjaxscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: 'center'," +
" displayIndent: '0em'," +
" showMathMenu: true," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important'} }" +
" } " +
"}); ";
(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/>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = 'likemath';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</article>
</li>
</ol>
</div>
</div>
<script>
var _gaq=[['_setAccount','UA-62001537-1'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));
</script>
<script src="../../theme/js/main.js"></script>
</body>
</html>