mirror of
https://github.com/AlekseyLobanov/AlekseyLobanov.github.io.git
synced 2026-01-11 20:52:01 +03:00
301 lines
46 KiB
HTML
301 lines
46 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='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/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 class="cp">#include <iostream></span></span>
|
||
<span class="code-line"><span class="cp">#include <algorithm></span></span>
|
||
<span class="code-line"><span class="cp">#include <vector></span></span>
|
||
<span class="code-line"><span class="cp">#include <set></span></span>
|
||
<span class="code-line"><span class="cp">#include <map></span></span>
|
||
<span class="code-line"><span class="cp">#include <cstdint></span></span>
|
||
<span class="code-line"></span>
|
||
<span class="code-line"><span class="cp">#include <boost/graph/adjacency_list.hpp></span></span>
|
||
<span class="code-line"><span class="cp">#include "primesieve.hpp"</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="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"><</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="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"><</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="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"><</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="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"><</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="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"><<</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="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"><</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="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"><<</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 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> |