{"id":368688,"date":"2024-05-21T03:47:35","date_gmt":"2024-05-21T03:47:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=368688"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=368688","title":{"rendered":"<span>\u041d\u043e\u0432\u044b\u0439 \u0440\u0435\u043a\u043e\u0440\u0434 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 FizzBuzz<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/79f\/b49\/2bc\/79fb492bc72f23efcf79e83d76b79365.png\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/79f\/b49\/2bc\/79fb492bc72f23efcf79e83d76b79365.png\"\/><\/figure>\n<p><strong>283 \u0413\u0411\/\u0441<\/strong>\u00a0\u043d\u0430 AMD Ryzen 9 7700X.  <\/p>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 (\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 GCC 13):<\/p>\n<pre><code class=\"powershell\">g++ fizzbuzz.cc -march=native -o fizzbuzz -O3 -Wall -std=c++20 -fno-tree-vectorize -fno-exceptions<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 CPU \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 <code>-fno-tree-vectorize<\/code>\u00a0\u0438\u043b\u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a:<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c pv (\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e <a href=\"https:\/\/github.com\/icetee\/pv\" rel=\"noopener noreferrer nofollow\"><u>1.6.6<\/u><\/a>, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0438 <code>-B<\/code> \u0437\u0430\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c)<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"powershell\">taskset -c 0-6 .\/fizzbuzz | taskset -c 7 pv -B 2M > \/dev\/null<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Linux 2.6.17 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h4>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430<code>kParallelism<\/code>\u00a0\u0432 <code>fizzbuzz.cc<\/code>\u00a0\u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0432\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 CPU \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0440\u0430\u0432\u043d\u043e\u0435 <code>kParallelism<\/code>. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0434\u0430\u0451\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 <code>taskset<\/code>\u00a0\u044f\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e <code>kParallelism<\/code><\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/jcvassort.open-web.fr\/how-to-disable-cpu-mitigations\/#how-to-disable-these-mitigations-to-make-linux-fast-again\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c mitigations<\/u><\/a>\u00a0(\u043f\u043e\u0441\u043b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c mitigations, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0442 \u043e\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 CPU).<\/p>\n<\/li>\n<\/ol>\n<p><code>\/proc\/sys\/fs\/pipe-max-size<\/code>\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 <code>14680064<\/code>\u00a0(14 \u041c\u0411) \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434 root (<code>sudo ...<\/code>)<\/p>\n<h3>\u041a\u043e\u0434<\/h3>\n<details class=\"spoiler\">\n<summary>\u0428\u0435\u0441\u0442\u044c\u0441\u043e\u0442 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;array> #include &lt;charconv> #include &lt;cstddef> #include &lt;cstdint> #include &lt;cstdlib> #include &lt;cstring> #include &lt;fcntl.h> #include &lt;iostream> #include &lt;optional> #include &lt;thread> #include &lt;unistd.h> #include &lt;sys\/mman.h>  namespace {  \/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 Constexpr \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f 10^X, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e std::pow \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f constexpr. constexpr int64_t PowTen(int x) {   int64_t result = 1;   for (int i = 0; i &lt; x; ++i) {     result *= 10;   }   return result; }  \/\/ \u041c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0437 |kParallelism| \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \/\/ \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 CPU \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0433\u043e. \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \/\/ \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \/\/ \u043f\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. constexpr int64_t kParallelism = 7; \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 kSuffixDigits \u0446\u0438\u0444\u0440 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \/\/ \u043f\u0440\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u0445. constexpr int64_t kSuffixDigits = 6; \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u0430\u0432\u043e\u0439 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043d\u0430 \u044d\u0442\u0443 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443. \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u0435\u043d 3. \u041f\u043e\u043a\u0430 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b. constexpr int64_t kIncrementBy = 3; \/\/ \u041e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a. constexpr int64_t kMaxLinesInBatch = PowTen(kSuffixDigits) * kIncrementBy \/ 3;  constexpr int kFizzLength = 4; constexpr int kBuzzLength = 4; constexpr int kNewlineLength = 1;  \/\/ \u0411\u0430\u0440\u044c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0436\u0434\u0443\u0449\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438. template &lt;typename Completion> class SpinningBarrier {  public:   \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u0441 |count| \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438    \/\/ \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f |completion_cb|.   \/\/ \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442   \/\/ \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d   \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f.   SpinningBarrier(int64_t count, Completion completion_cb) :       count_(count), spaces_(count), generation_(0),       completion_cb_(completion_cb) {}    void Wait() {       int64_t my_generation = generation_;       if (!--spaces_) {           spaces_ = count_;           completion_cb_();           ++generation_;       } else {           while(generation_ == my_generation);       }   }   private:   int64_t count_;   std::atomic&lt;int64_t> spaces_;   std::atomic&lt;int64_t> generation_;   Completion completion_cb_; };  \/\/ \u0412\u043b\u0430\u0434\u0435\u0435\u0442 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c. class OutputHandler {  static constexpr size_t kBufferSize = 14 * 1024 * 1024;   public:   OutputHandler() {     for (int i = 0; i &lt; 3; ++i) {       buffers_[i] =         static_cast&lt;char*>(aligned_alloc(2 * 1024 * 1024, kBufferSize));       madvise(buffers_[i], kBufferSize, MADV_HUGEPAGE);     }   }    ~OutputHandler() {     for (int i = 0; i &lt; 3; ++i) {       free(buffers_[i]);     }   }    void Output(int buffer_id, size_t bytes) {     \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0431\u0443\u0444\u0435\u0440\u0430. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 (\u0438\u043b\u0438 \u0435\u0433\u043e     \/\/ \u0447\u0430\u0441\u0442\u044c) \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435, \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 API, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043d\u0430\u0442\u044c,     \/\/ \u043a\u043e\u0433\u0434\u0430 downstream-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430,     \/\/ \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0443\u043c\u043e\u043c.     \/\/ \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c,     \/\/ \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 0, 1, 2 \u043a\u0430\u043d\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442     \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 0. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c,     \/\/ \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f     \/\/ TargetPipeSize. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u0438\u0436\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e     \/\/ \u043c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u043c (4 \u041a\u0411 \u0432 Linux), \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438     \/\/ \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0431\u0443\u0444\u0435\u0440\u0430. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u044b \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e write(),     \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u0440\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438     \/\/ \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u0437 downstream-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.     \/\/ \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 Output() \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440     \/\/ (\u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0442\u0432\u044c else), \u0442\u043e \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f     \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     \/\/ \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e Output() \u0431\u0443\u0434\u0435\u0442     \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 (\u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e,     \/\/ \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f).     SetPipeSize(TargetPipeSize(bytes));     if (2 * bytes >= pipe_size_) {       OutputWithVmSplice(buffers_[buffer_id], bytes);     } else {       if (write(STDOUT_FILENO, buffers_[buffer_id], bytes) &lt; 0) {         std::cerr &lt;&lt; \"write error: \" &lt;&lt; errno;         std::abort();       }     }   }    char* GetBuffer(int buffer_id) {     return buffers_[buffer_id];   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438.   \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0441\u0430\u043c \u0432\u044b\u0432\u043e\u0434 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430   \/\/ \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.   int NextBufferId() {     buffer_id_ = (buffer_id_ + 1) % 3;     return buffer_id_;   }    static constexpr int64_t BufferSize() {     return kBufferSize;   }   private:   \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 |out_bytes|.   size_t TargetPipeSize(size_t out_bytes) const {     \/\/ \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c \u0434\u0432\u043e\u0439\u043a\u0438 \u0438 >= 4 \u041a\u0411 \u0432 Linux.     \/\/ \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u044b\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 (\u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e     \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c |out_bytes| \u0432\u0432\u0435\u0440\u0445 \u0434\u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439     \/\/ \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438.     return std::max(4ul * 1024, std::bit_ceil(out_bytes));   }    void OutputWithVmSplice(char* buffer, size_t bytes) const {     iovec iov;     iov.iov_base = buffer;     iov.iov_len = bytes;     while (true) {       int64_t ret = vmsplice(STDOUT_FILENO, &amp;iov, 1, SPLICE_F_NONBLOCK);       if (ret >= 0) {         iov.iov_len -= ret;         iov.iov_base = reinterpret_cast&lt;char*>(iov.iov_base) + ret;         if (iov.iov_len == 0) {           break;         }       } else {         if (errno != EAGAIN) {           std::cerr &lt;&lt; \"vmsplice error: \" &lt;&lt; errno;           std::abort();         }       }     }   }    void SetPipeSize(size_t size) {     if (pipe_size_ == size) {       return;     }     size_t new_pipe_size = fcntl(STDOUT_FILENO, F_SETPIPE_SZ, size);     if (new_pipe_size &lt; 0) {       std::cerr &lt;&lt; \"Error while calling fcntl F_SETPIPE_SZ \" &lt;&lt; errno       &lt;&lt; \"\\nPerhaps you need to update \/proc\/sys\/fs\/pipe-max-size or \"          \"run the program as sudo\";       std::abort();     }      pipe_size_ = new_pipe_size;   }    std::array&lt;char*, 3> buffers_;   int buffer_id_ = 0;   size_t pipe_size_; };  \/\/ \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 fizzbuzz \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 |line| \u0438 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \/\/ \u0432 |out|. \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. char* InsertFizzBuzzLine(char* out, int64_t line) {   if (line % 15 == 0) {     std::memcpy(out, \"FizzBuzz\\n\", 9);     return out + 9;   } else if (line % 3 == 0) {     std::memcpy(out, \"Fizz\\n\", 5);     return out + 5;   } else if (line % 5 == 0) {     std::memcpy(out, \"Buzz\\n\", 5);     return out + 5;   } else {     \/\/ \u041c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e 10^20.     char* next = std::to_chars(out, out + 20, line).ptr;     *next = '\\n';     return next + 1;   } }  \/\/ \u041f\u0440\u043e\u0433\u043e\u043d (Run) - \u044d\u0442\u043e \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 |DIGITS| \u0446\u0438\u0444\u0440. \/\/ Run&lt;1>: [1,9] \/\/ Run&lt;2>: [10,99] \/\/ ... template&lt;int DIGITS> class Run {    static_assert(DIGITS >= 1);    static constexpr int FizzBuzzLineLength(int64_t number_mod_15) {     if (number_mod_15 % 15 == 0) {       return 9;     } else if (number_mod_15 % 3 == 0) {       return 5;     } else if (number_mod_15 % 5 == 0) {       return 5;     } else {       return DIGITS + 1;     }   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e fifteener \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.   static constexpr size_t FifteenerBytes() {     size_t size = 0;     for (int i = 0; i &lt; 15; ++i) {       size += FizzBuzzLineLength(i);     }     return size;   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435.   static constexpr int64_t LinesInRun() {     return PowTen(DIGITS) - PowTen(DIGITS - 1);   }    \/\/ \u0412\u0435\u0441\u044c \u0432\u044b\u0432\u043e\u0434 fizz-buzz \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432.   static constexpr size_t RunBytes() {     if constexpr(DIGITS == 1) {       return 5 + 3 * kFizzLength + 1 * kBuzzLength + 9 * kNewlineLength;     } else {       return LinesInRun() \/ 15 * FifteenerBytes();     }   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435.   static constexpr int64_t BatchesInRun() {     if constexpr (DIGITS > kSuffixDigits) {       return PowTen(DIGITS - kSuffixDigits - 1) * 9;     } else {       return 1;     }   }   public:   \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0443\u0444\u0435\u0440\u044b \u0438\u0437 |output_handler|.   static void Execute(OutputHandler&amp; output_handler) {     Batch&lt;0> batch0(&amp;output_handler);     Batch&lt;1> batch1(&amp;output_handler);     Batch&lt;2> batch2(&amp;output_handler);     \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439     \/\/ \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430 \u043f\u0440\u043e\u0433\u043e\u043d. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043c\u044b     \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0447\u0438\u0441\u0435\u043b (\u0441\u043c. \u043d\u0438\u0436\u0435), \u0447\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.     batch0.Init();     batch0.Output();     if constexpr (BatchesInRun() > 1) {       batch1.Init();       batch1.Output();     }     if constexpr (BatchesInRun() > 2) {       batch2.Init();       batch2.Output();     }      if constexpr (BatchesInRun() > 3) {       int64_t prefix = PowTen(DIGITS - kSuffixDigits - 1);       \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 |kParallelism| \u043f\u043e\u0442\u043e\u043a\u043e\u0432       \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.       \/\/ \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f       \/\/ \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0432\u043e\u0434. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430       SpinningBarrier barrier(kParallelism, [&amp;] {         switch (prefix % 3) {           \/\/ \u0412 \u043d\u0430\u0447\u0430\u043b\u0435           \/\/   batch0 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 10..00 ( \u2261 1 mod 3),           \/\/   batch1 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 10..01 ( \u2261 2 mod 3),           \/\/   batch2 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 10..02 ( \u2261 0 mod 3).           \/\/ \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u0433\u0440\u0443\u043f\u043f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u043d\u0430 3,           \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 mod \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.           case 0: batch2.Output(); break;           case 1: batch0.Output(); break;           case 2: batch1.Output(); break;         }         prefix++;       });        [&amp;]&lt;size_t... THREAD_ID>(std::index_sequence&lt;THREAD_ID...>) {         \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c |kParallelism| \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432,         \/\/ \u043d\u043e \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432         \/\/ \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0442\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.         (std::jthread([&amp;] {           for (int64_t batch = 3; batch &lt; BatchesInRun();                batch += 3) {             \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a \u0432 \u0433\u0440\u0443\u043f\u043f\u0435.             Chunk&lt;0, THREAD_ID>(batch0).IncrementNumbers(prefix);             \/\/ \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0442, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442             \/\/ \u0431\u0430\u0440\u044c\u0435\u0440\u0430; \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0432\u0448\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 batch.Output()             \/\/ (\u0441\u043c. \u0432\u044b\u0448\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 |barrier|).             barrier.Wait();             Chunk&lt;1, THREAD_ID>(batch1).IncrementNumbers(prefix);             barrier.Wait();             Chunk&lt;2, THREAD_ID>(batch2).IncrementNumbers(prefix);             barrier.Wait();           }         }) , ...);       }(std::make_index_sequence&lt;kParallelism>());     }   }    \/\/ \u0413\u0440\u0443\u043f\u043f\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 10^|kSuffixDigits| \u0441\u0442\u0440\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430.   \/\/ \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 |kSuffixDigits| \u0446\u0438\u0444\u0440 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c.   \/\/ \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.   \/\/ BATCH_ID \u2208 [0, 1, 2]   template&lt;int BATCH_ID>   class Batch {     static_assert(BATCH_ID &lt; 3);     using PreviousBatch = Batch&lt;BATCH_ID - 1>;      public:     Batch(OutputHandler* output_handler) : output_handler_(output_handler) {       static_assert(OutputHandler::BufferSize() >= BytesInBatch());     }      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443, \u0432\u0437\u044f\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438\u0437     \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044f \u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.     void Init() {       buffer_id_ = output_handler_->NextBufferId();       char* out = GetBuffer();       int64_t start = PowTen(DIGITS - 1) + BATCH_ID * LinesInBatch();       int64_t end = std::min(PowTen(DIGITS), start + LinesInBatch());       for (int64_t line = start; line &lt; end; ++line) {         out = InsertFizzBuzzLine(out, line);       }     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 mod 15.     static constexpr int64_t FirstLineNumberMod15() {       if constexpr (BATCH_ID == 0) {         return DIGITS > 1 ? 10 : 1;       } else {         return (PreviousBatch::FirstLineNumberMod15() +           PreviousBatch::LinesInBatch()) % 15;       }     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435.     static constexpr int64_t LinesInBatch() {       return std::min(kMaxLinesInBatch, LinesInRun());     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.     static constexpr int64_t BytesInBatch() {       if constexpr (LinesInBatch() &lt; kMaxLinesInBatch) {         return RunBytes();       } else {         size_t size = LinesInBatch() \/ 15 * FifteenerBytes();         for (int64_t i = FirstLineNumberMod15() + LinesInBatch() \/ 15 * 15;              i &lt; FirstLineNumberMod15() + LinesInBatch(); ++i) {           size += FizzBuzzLineLength(i);         }         return size;       }     }      void Output() {       output_handler_->Output(buffer_id_, BytesInBatch());     }      char* GetBuffer() {       return output_handler_->GetBuffer(buffer_id_);     }      OutputHandler* output_handler_;     \/\/ id \u0431\u0443\u0444\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 |output_handler_|.     int buffer_id_;   };    \/\/ \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u043b\u043e\u043a - \u0447\u0430\u0441\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0441 id   \/\/ |THREAD_ID|. THREAD_ID \u2208 [0, kParallelism)   \/\/ \u0422\u0430\u043a \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c,   \/\/ \u043c\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e BATCH_ID \u0438 THREAD_ID, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u044b   \/\/ \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.   template&lt;int BATCH_ID, int THREAD_ID>   class Chunk {     using PreviousChunk = Chunk&lt;BATCH_ID, THREAD_ID - 1>;      public:     \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u043b\u043e\u043a, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 |batch|.     Chunk(Batch&lt;BATCH_ID> batch) : batch_(batch) {}      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 mod 15.     static constexpr int64_t FirstLineNumberMod15() {       if constexpr (THREAD_ID == 0) {         return Batch&lt;BATCH_ID>::FirstLineNumberMod15();       } else {         return (PreviousChunk::FirstLineNumberMod15() +           PreviousChunk::LinesInChunk()) % 15;       }     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435.     static constexpr int64_t StartIndexInBatch() {       if constexpr (THREAD_ID == 0) {         return 0;       } else {         return PreviousChunk::StartIndexInBatch() +           PreviousChunk::BytesInChunk();       }     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435.     static constexpr int64_t LinesInChunk() {       int64_t done = THREAD_ID == 0 ? 0 :         PreviousChunk::CumulativeLinesUpToChunk();       int64_t remaining_lines = Batch&lt;BATCH_ID>::LinesInBatch() - done;       int64_t remaining_threads = kParallelism - THREAD_ID;       \/\/ \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 ceil(remaining_lines \/ remaining_threads)       return (remaining_lines - 1) \/ remaining_threads + 1;     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u044d\u0442\u043e\u043c \u0438 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0433\u0440\u0443\u043f\u043f\u044b.     static constexpr int64_t CumulativeLinesUpToChunk() {       if constexpr (THREAD_ID &lt; 0) {         return 0;       } else {         return PreviousChunk::CumulativeLinesUpToChunk() + LinesInChunk();       }     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.     static constexpr int64_t BytesInChunk() {       size_t size = LinesInChunk() \/ 15 * FifteenerBytes();       for (int64_t i = FirstLineNumberMod15() + LinesInChunk() \/ 15 * 15;            i &lt; FirstLineNumberMod15() + LinesInChunk(); ++i) {         size += FizzBuzzLineLength(i);       }       return size;     }      \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0432\u0441\u0435\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0431\u043b\u043e\u043a\u0435.     \/\/ \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 IncrementNumbersImpl \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438     \/\/ \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 |prefix|.     void IncrementNumbers(int64_t prefix) {       \/\/ \u0415\u0441\u043b\u0438 DIGITS &lt; kSuffixDigits, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430       \/\/ \u0443\u043c\u0435\u0441\u0442\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0433\u0440\u0443\u043f\u043f\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IncrementNumbers().       \/\/ \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0438\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.       static_assert(DIGITS >= kSuffixDigits);       constexpr int64_t max_overflow_digits = DIGITS - kSuffixDigits;       \/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e IncrementChunkImpl() \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f       \/\/ \u0432 0..max_overflow_digits. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0451 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.       constexpr auto increment_chunk_impls = []() {         std::array&lt;void (*)(char*), max_overflow_digits + 1> res{};         [&amp;]&lt;size_t... OVERFLOW_DIGITS>(std::index_sequence&lt;OVERFLOW_DIGITS...>) {           ((res[OVERFLOW_DIGITS] = &amp;IncrementNumbersImpl&lt;OVERFLOW_DIGITS>), ...);         }(std::make_index_sequence&lt;max_overflow_digits + 1>());         return res;       }();        increment_chunk_impls[OverflowDigits(prefix)](batch_.GetBuffer());     }      private:     \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0432 |batch|.     \/\/     \/\/ \u041a\u0430\u0436\u0434\u0430\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 |kIncrementBy| * 10^kSuffixDigits.     \/\/ \u0415\u0441\u043b\u0438 OVERFLOW_DIGITS > 0, \u0442\u043e \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e,     \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u0444\u0440.     \/\/ \u0417\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0446\u0438\u0444\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435,     \/\/ \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430.      \/\/ \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 kIncrementBy = 3 and kSuffixDigits = 6, \u0442\u043e     \/\/ \u0431\u043b\u043e\u043a [100000000, 100999999] \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e [103000000; 103999999]     \/\/ \u0441  OVERFLOW_DIGITS = 0 (\u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f).     \/\/ \u041f\u0440\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 [108000000, 108999999] \u0434\u043e [111000000; 111999999],     \/\/ OVERFLOW_DIGITS = 1 (\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0446\u0438\u0444\u0440\u0443).     \/\/ \u041f\u0440\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 [198000000, 198999999] \u0434\u043e [201000000, 201999999],     \/\/ OVERFLOW_DIGITS = 2 (\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b)     template&lt;int OVERFLOW_DIGITS>     static void IncrementNumbersImpl(char* batch) {       char* out = batch;       constexpr int64_t start_index = StartIndexInBatch();       constexpr int first_line_number_mod_15 = FirstLineNumberMod15();        \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 |num_lines|, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 |out|.       \/\/ |num_lines| \u0434\u043e\u043b\u0436\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 120 (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438).       auto increment = [&amp;] (int num_lines) __attribute__((always_inline)) {         int line_start = 0;         #pragma GCC unroll 120         for (int64_t line = 0; line &lt; num_lines; ++line) {           if (IsFizzBuzzNumber(first_line_number_mod_15 + line)) {             \/\/ \u0427\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434,             \/\/ \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442.             \/\/ \u0422\u0430\u043a \u043a\u0430\u043a \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 |line_start|             \/\/ \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. |start_index| - \u044d\u0442\u043e constexpr,             \/\/ \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e.             IncrementNumber(out, line_start + start_index, OVERFLOW_DIGITS);           }           line_start +=               FizzBuzzLineLength((first_line_number_mod_15 + line) % 15);         }         \/\/ \u0422\u0430\u043a \u043a\u0430\u043a num_lines \u043a\u0440\u0430\u0442\u043d\u043e 120, \u043f\u0440\u0430\u0432\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430         \/\/ \u043a\u0440\u0430\u0442\u043d\u0430 8 \u0438 \u044d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e |out| \u043f\u043e\u0437\u0436\u0435 \u0431\u0443\u0434\u0435\u0442         \/\/ \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c.         out += FifteenerBytes() * num_lines \/ 15;       };        for (int64_t i = 0; i &lt; LinesInChunk() \/ 120; ++i) {         increment(120);       }       increment(LinesInChunk() % 120);     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u043e     \/\/ \u043d\u0435 \u043a\u0440\u0430\u0442\u043d\u043e 3 \u0438 5.     static constexpr bool IsFizzBuzzNumber(int64_t number) {       return number % 3 != 0 &amp;&amp; number % 5 != 0;     }      \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u043b\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 base[line_start].     \/\/ |base| \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u0430 \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c,     \/\/ \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0440\u0430\u0432\u043d\u043e |overflow_digits|.     \/\/ \u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 |line_start| \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f     \/\/ \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.     __attribute__((always_inline))     static inline void IncrementNumber(char* base,                                        int64_t line_start,                                        int overflow_digits) {       int64_t right_most_digit_to_update_index =           line_start + DIGITS - 1 - kSuffixDigits;       \/\/ \u041a\u043e\u0433\u0434\u0430 overflow_digits \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b IncrementAt,       \/\/ \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 8-\u0431\u0430\u0439\u0442\u043d\u044b\u0439 integer, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c       \/\/ \u0432 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443.       IncrementAt(base, right_most_digit_to_update_index, kIncrementBy);       #pragma GCC unroll 100       for (int i = 0; i &lt; overflow_digits; ++i) {         IncrementAt(base, right_most_digit_to_update_index, -10);         IncrementAt(base, right_most_digit_to_update_index - 1, 1);         right_most_digit_to_update_index--;       }     }      \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0439\u0442 \u043f\u043e |index| \u0432 |base| \u043d\u0430 |by|.     \/\/ |base| \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u0430 \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c.     \/\/ \u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 |index| \u0438  |by| \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f     \/\/ \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442.     __attribute__((always_inline))     static inline void IncrementAt(char* base, int64_t index, char by) {       union char_array_int64 {         char ch[8];         int64_t int64;       };       auto base_as_union = reinterpret_cast&lt;char_array_int64*>(base);       \/\/ \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 little endian.       static_assert(std::endian::native == std::endian::little);       \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 |index| \u043d\u0430 |by|. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e       \/\/ \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.       base_as_union[index \/ 8].int64 +=         static_cast&lt;int64_t>(by) &lt;&lt; ((index % 8) * 8);     }      \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u0444\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u0440\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0435     \/\/ |prefix| \u043d\u0430 |kIncrementBy|.     \/\/ \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 kIncrementBy = 3:     \/\/ OverflowDigits(100) = 0 (\u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440)     \/\/ OverflowDigits(108) = 1 (8 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 0 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 1)     \/\/ OverflowDigits(198) = 2 (8 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 9 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f)     static int OverflowDigits(int64_t prefix) {       int incremented = prefix + kIncrementBy;       #pragma GCC unroll 2       for (int i = 0; i &lt; 20; ++i) {         incremented \/= 10;         prefix \/= 10;         if (incremented == prefix) {           return i;         }       }       return 20;     }      Batch&lt;BATCH_ID> batch_;   }; };  } \/\/ \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d  int main() {   OutputHandler output_handler;    [&amp;]&lt;std::size_t... I>(std::index_sequence&lt;I...>){     (Run&lt;I + 1>::Execute(output_handler), ...);   }(std::make_index_sequence&lt;18>());    return 0; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/h3>\n<p>\u042f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u0434\u0435\u0439 \u0438\u0437 <a href=\"https:\/\/codegolf.stackexchange.com\/a\/236630\/7251\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0442\u0432\u0435\u0442\u0430 ais523<\/u><\/a>, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e vmsplice \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043a\u0430\u043d\u0430\u043b<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u043f\u043e 2 \u041c\u0411 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e huge pages<\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/h4>\n<ul>\n<li>\n<p>\u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438: id \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 1, 2, &#8230;<\/p>\n<\/li>\n<li>\n<p>mod: \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 mod 15<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u043e\u043a\u0430 fizzbuzz: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u0444\u0443\u043d\u043a\u0446\u0438\u044f fizzbuzz: \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 fizzbuzz \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0435 fizzbuzz<\/p>\n<\/li>\n<li>\n<p>\u0447\u0438\u0441\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430: \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430, \u044f\u0432\u043b\u044f\u044e\u0449\u0430\u044f\u0441\u044f \u0447\u0438\u0441\u043b\u043e\u043c (\u043d\u0435 fizz, buzz \u0438\u043b\u0438 fizzbuzz)<\/p>\n<\/li>\n<li>\n<p>fifteener: 15 \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u0433\u0440\u0443\u043f\u043f\u0430 (batch): 1000000 \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0433\u043e\u043d (run): \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u0433\u0434\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u0444\u0440 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e 10, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, run(6) \u2014 \u044d\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u043a 100000 &#8230; 999999<\/p>\n<\/li>\n<\/ul>\n<h4>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f<\/h4>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 1:<\/strong>\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e fifteener \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0434 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 1, 2, 4, 7, 8, 11, 13 \u0438 14<\/p>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 2:<\/strong>\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e fifteener<\/p>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 3:<\/strong>\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 mod = 10, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e 10^N \u2261 10 (mod 15) \u0434\u043b\u044f N > 0<\/p>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 4:<\/strong>\u00a0\u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b (3000000 \u0441\u0442\u0440\u043e\u043a) \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0448\u0435\u0441\u0442\u043e\u0439 \u0446\u0438\u0444\u0440\u044b (\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0442 0) \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 3 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c. \u041c\u044b \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 6 \u0446\u0438\u0444\u0440 \u0447\u0438\u0441\u043b\u0430 <em>\u0446\u0438\u0444\u0440\u0430\u043c\u0438-\u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430\u043c\u0438<\/em>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f. \u0421\u0442\u0440\u043e\u043a\u0438 fizz\/buzz\/fizzbuzz \u0442\u043e\u0436\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 run(9) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>BUZZ 100000001 FIZZ 100000003 100000004 FIZZBUZZ ... FIZZ 100999999<\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 run(9):<\/p>\n<pre><code>BUZZ FIZZ 101000002 101000003 ... 101999998 101999999<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0433\u0440\u0443\u043f\u043f\u0430 run(9):<\/p>\n<pre><code>FIZZBUZZ 102000001 102000002 FIZZ ... 102999998 FIZZ<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0430 3000000:<\/p>\n<pre><code>BUZZ 103000001 FIZZ 103000003 103000004 FIZZBUZZ ... FIZZ 105999999<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0438\u0444\u0440 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430. \u041d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0440\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u0442\u0440\u0451\u0445 \u0433\u0440\u0443\u043f\u043f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 3000000.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 103000003 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>['1','0','3','0','0','0','0','0','3']<\/code>\u00a0=\u00a0<code>[49, 48, 51, 48, 48, 48, 48, 48, 51]<\/code>. \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 3000000 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0448\u0435\u0441\u0442\u043e\u0439 \u0446\u0438\u0444\u0440\u044b (\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0442 0) \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0442\u0440\u0438.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0451\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e: \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u043e \u0434\u0432\u0443\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043c\u043e\u0433 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c downstream-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u0441\u043c. vmsplice \u0438 <a href=\"https:\/\/mazzo.li\/posts\/fast-pipes.html\" rel=\"noopener noreferrer nofollow\"><u>\u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/u><\/a>), \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>for run in 1..19:   \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c batch0 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 fizz buzz \u043e\u0442 10^(run-1) \u0434\u043e 10^(run-1) + 999999   \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch0   \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c batch1 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 fizz buzz \u043e\u0442 10^(run-1) + 1000000 \u0434\u043e 10^(run-1) + 1999999   \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch1   \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c batch2 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 fizz buzz \u043e\u0442 10^(run-1) + 2000000 \u0434\u043e 10^(run-1) + 2999999   \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch2   for batch in 3..(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f \u0432 \u043f\u0440\u043e\u0433\u043e\u043d\u0435):     \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c batch0     \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch0     \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c batch1     \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch1     \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c batch2     \u0432\u044b\u0432\u043e\u0434\u0438\u043c batch2<\/code><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044b\u0441\u0442\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 (\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0440\u0430\u0442\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438) \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2014 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0446\u0438\u0444\u0440\u0443 8 \u0432 108399977 \u043d\u0430 3, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0446\u0438\u0444\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u041c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 8 \u043d\u0430 3, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u044f 10 \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044f 1 \u043a 0 \u043f\u0435\u0440\u0435\u0434 8 (\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a \u0436\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435). \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0446\u0438\u0444\u0440\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0438\u0441\u043b\u0430 198399977. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c 3 \u043a 8<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c 10 \u0438\u0437 8 + 3<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c 1 \u043a 9<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c 10 \u0438\u0437 9 + 1<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c 1 \u043a 1<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d 201399977.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439. \u0418 \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0433\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0433\u0440\u0443\u043f\u043f\u0430 \u2014 \u044d\u0442\u043e 1000000 \u0441\u0442\u0440\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430, \u0442\u043e \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.<\/p>\n<pre><code>122|531269     ------  \u0441\u0443\u0444\u0444\u0438\u043a\u0441 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 6 \u0446\u0438\u0444\u0440) ---         \u043f\u0440\u0435\u0444\u0438\u043a\u0441 (\u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0446\u0438\u0444\u0440\u044b)<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441.<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0446\u0438\u0444\u0440 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u0431\u043b\u043e\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041e\u0434\u043d\u0430 \u0447\u0430\u0441\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>\u0431\u043b\u043e\u043a\u043e\u043c<\/strong> (<strong>chunk)<\/strong>.<\/p>\n<h3>\u0425\u0438\u0442\u0440\u043e\u0441\u0442\u0438 C++<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u043c\u044b\u0441\u043b\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0435\u0433\u043e:<\/p>\n<h4>8 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c 1<\/h4>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e\u0431 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u043d\u043e CPU \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 8-\u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438 integer \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0441 1-\u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440 \u0438\u0437-\u0437\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 8 \u0431\u0430\u0439\u0442\u043e\u0432 \u0437\u0430 \u0440\u0430\u0437 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b integer \u0431\u044b\u043b\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f 8-\u0431\u0430\u0439\u0442\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0438\u0441\u043b\u043e 12019839977, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 6 \u043a \u0446\u0438\u0444\u0440\u0435 8 (\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435). \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e (\u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435) \u0438\u043d\u0434\u0435\u043a\u0441\u044b mod 8 \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code>\u0432\u044b\u0432\u043e\u0434:        X Y 1 2 0 1 9 8 3 9 9 7 7 \u0438\u043d\u0434\u0435\u043a\u0441 mod 8:   0 1 2 3 4 5 6 7 0 1 2 3 4<\/code><\/pre>\n<p><code>X Y<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0430\u0434\u0440\u0435\u0441 <code>X<\/code>\u00a0 \u043a\u0430\u043a <code>base<\/code>. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 (<code>base + 7<\/code>), (<code>base + 6<\/code>) \u0438 (<code>base + 5<\/code>), \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c 8 \u0431\u0430\u0439\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 little endian (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, x86), \u0433\u0434\u0435 \u0441\u0430\u043c\u044b\u0439 \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u0431\u0430\u0439\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u0435, \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code>base[index \\ 8] += 1 &lt;&lt; (5 * 8)  |  (1 - 10) &lt;&lt; (6 * 8)  |  (6 - 10) &lt;&lt; (7 * 8)                          ^             ^                   \u0438\u043d\u0434\u0435\u043a\u0441 mod 8 = 5   \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 1 - 10 (\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435)<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 OR. \u0415\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043c\u0451\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code>base[index \\ 8] += 1 &lt;&lt; (5 * 8); base[index \\ 8] += (1 - 10) &lt;&lt; (6 * 8); base[index \\ 8] += (6 - 10) &lt;&lt; (7 * 8);<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0438\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u043e \u0431\u044b \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0447\u0438\u0441\u0435\u043b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0437\u0430 \u0440\u0430\u0437, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&#8230;<\/p>\n<h4>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0415\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 mod 10, \u0432\u0442\u043e\u0440\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 mod 5, \u0430 \u0431\u043b\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 mod 0.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u0430 \u043f\u043e 8 \u0431\u0430\u0439\u0442\u0430\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u0431\u043b\u043e\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 C++ \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0430 <code>(run digits, batch id, chunk id, overflows)<\/code>.<\/p>\n<ul>\n<li>\n<p>run digits: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u0444\u0440 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430<\/p>\n<\/li>\n<li>\n<p>batch id: 0, 1 \u0438\u043b\u0438 2 (\u0441\u043c. \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 4 \u0432\u044b\u0448\u0435)<\/p>\n<\/li>\n<li>\n<p>chunk id: \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435, [0, kParallelism)<\/p>\n<\/li>\n<li>\n<p>overflow count: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0446\u0438\u0444\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0446\u0438\u0444\u0440\u044b \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u043c\u044b \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0417\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043b\u0433\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b add\/sub \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"assembly\">add QWORD PTR 8[rax], rdx sub QWORD PTR 40[rax], 1033 add QWORD PTR 32[rax], rdx add QWORD PTR 56[rax], r8 sub QWORD PTR 88[rax], 4 add QWORD PTR 80[rax], rsi sub QWORD PTR 104[rax], 67698432 sub QWORD PTR 128[rax], 67698432 sub QWORD PTR 160[rax], 4 [\u0435\u0449\u0451 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e add\/sub]<\/code><\/pre>\n<p>\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e fifteener \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e 8 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p><strong>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u0435 \u043e\u0442\u0437\u044b\u0432\u044b \u0438 \u0438\u0434\u0435\u0438 \u043f\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430!<\/strong><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/794925\/\"> https:\/\/habr.com\/ru\/articles\/794925\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p><strong>283 \u0413\u0411\/\u0441<\/strong>\u00a0\u043d\u0430 AMD Ryzen 9 7700X.  <\/p>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 (\u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 GCC 13):<\/p>\n<pre><code class=\"powershell\">g++ fizzbuzz.cc -march=native -o fizzbuzz -O3 -Wall -std=c++20 -fno-tree-vectorize -fno-exceptions<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 CPU \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 <code>-fno-tree-vectorize<\/code>\u00a0\u0438\u043b\u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a:<\/p>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c pv (\u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e <a href=\"https:\/\/github.com\/icetee\/pv\" rel=\"noopener noreferrer nofollow\"><u>1.6.6<\/u><\/a>, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0438 <code>-B<\/code> \u0437\u0430\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c)<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"powershell\">taskset -c 0-6 .\/fizzbuzz | taskset -c 7 pv -B 2M > \/dev\/null<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Linux 2.6.17 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h4>\n<ol>\n<li>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430<code>kParallelism<\/code>\u00a0\u0432 <code>fizzbuzz.cc<\/code>\u00a0\u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0432\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 CPU \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0440\u0430\u0432\u043d\u043e\u0435 <code>kParallelism<\/code>. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0434\u0430\u0451\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 <code>taskset<\/code>\u00a0\u044f\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e <code>kParallelism<\/code><\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/jcvassort.open-web.fr\/how-to-disable-cpu-mitigations\/#how-to-disable-these-mitigations-to-make-linux-fast-again\" rel=\"noopener noreferrer nofollow\"><u>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c mitigations<\/u><\/a>\u00a0(\u043f\u043e\u0441\u043b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c mitigations, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0442 \u043e\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 CPU).<\/p>\n<\/li>\n<\/ol>\n<p><code>\/proc\/sys\/fs\/pipe-max-size<\/code>\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 <code>14680064<\/code>\u00a0(14 \u041c\u0411) \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434 root (<code>sudo ...<\/code>)<\/p>\n<h3>\u041a\u043e\u0434<\/h3>\n<details class=\"spoiler\">\n<summary>\u0428\u0435\u0441\u0442\u044c\u0441\u043e\u0442 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;array> #include &lt;charconv> #include &lt;cstddef> #include &lt;cstdint> #include &lt;cstdlib> #include &lt;cstring> #include &lt;fcntl.h> #include &lt;iostream> #include &lt;optional> #include &lt;thread> #include &lt;unistd.h> #include &lt;sys\/mman.h>  namespace {  \/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 Constexpr \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f 10^X, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e std::pow \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f constexpr. constexpr int64_t PowTen(int x) {   int64_t result = 1;   for (int i = 0; i &lt; x; ++i) {     result *= 10;   }   return result; }  \/\/ \u041c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0437 |kParallelism| \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \/\/ \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 CPU \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0433\u043e. \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \/\/ \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \/\/ \u043f\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. constexpr int64_t kParallelism = 7; \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 kSuffixDigits \u0446\u0438\u0444\u0440 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \/\/ \u043f\u0440\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u0445. constexpr int64_t kSuffixDigits = 6; \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u0430\u0432\u043e\u0439 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043d\u0430 \u044d\u0442\u0443 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443. \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u0435\u043d 3. \u041f\u043e\u043a\u0430 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b. constexpr int64_t kIncrementBy = 3; \/\/ \u041e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a. constexpr int64_t kMaxLinesInBatch = PowTen(kSuffixDigits) * kIncrementBy \/ 3;  constexpr int kFizzLength = 4; constexpr int kBuzzLength = 4; constexpr int kNewlineLength = 1;  \/\/ \u0411\u0430\u0440\u044c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0436\u0434\u0443\u0449\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438. template &lt;typename Completion> class SpinningBarrier {  public:   \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u0441 |count| \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438    \/\/ \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f |completion_cb|.   \/\/ \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0431\u0430\u0440\u044c\u0435\u0440\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442   \/\/ \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d   \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f.   SpinningBarrier(int64_t count, Completion completion_cb) :       count_(count), spaces_(count), generation_(0),       completion_cb_(completion_cb) {}    void Wait() {       int64_t my_generation = generation_;       if (!--spaces_) {           spaces_ = count_;           completion_cb_();           ++generation_;       } else {           while(generation_ == my_generation);       }   }   private:   int64_t count_;   std::atomic&lt;int64_t> spaces_;   std::atomic&lt;int64_t> generation_;   Completion completion_cb_; };  \/\/ \u0412\u043b\u0430\u0434\u0435\u0435\u0442 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c. class OutputHandler {  static constexpr size_t kBufferSize = 14 * 1024 * 1024;   public:   OutputHandler() {     for (int i = 0; i &lt; 3; ++i) {       buffers_[i] =         static_cast&lt;char*>(aligned_alloc(2 * 1024 * 1024, kBufferSize));       madvise(buffers_[i], kBufferSize, MADV_HUGEPAGE);     }   }    ~OutputHandler() {     for (int i = 0; i &lt; 3; ++i) {       free(buffers_[i]);     }   }    void Output(int buffer_id, size_t bytes) {     \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0431\u0443\u0444\u0435\u0440\u0430. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 (\u0438\u043b\u0438 \u0435\u0433\u043e     \/\/ \u0447\u0430\u0441\u0442\u044c) \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435, \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 API, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043d\u0430\u0442\u044c,     \/\/ \u043a\u043e\u0433\u0434\u0430 downstream-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430,     \/\/ \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0443\u043c\u043e\u043c.     \/\/ \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c,     \/\/ \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 0, 1, 2 \u043a\u0430\u043d\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442     \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 0. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c,     \/\/ \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f     \/\/ TargetPipeSize. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u0438\u0436\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e     \/\/ \u043c\u044b \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u043c (4 \u041a\u0411 \u0432 Linux), \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438     \/\/ \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u0431\u0443\u0444\u0435\u0440\u0430. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u044b \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e write(),     \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u0440\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438     \/\/ \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0438\u0437 downstream-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.     \/\/ \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 Output() \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440     \/\/ (\u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0442\u0432\u044c else), \u0442\u043e \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f     \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     \/\/ \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u041c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e Output() \u0431\u0443\u0434\u0435\u0442     \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 (\u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e,     \/\/ \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f).     SetPipeSize(TargetPipeSize(bytes));     if (2 * bytes >= pipe_size_) {       OutputWithVmSplice(buffers_[buffer_id], bytes);     } else {       if (write(STDOUT_FILENO, buffers_[buffer_id], bytes) &lt; 0) {         std::cerr &lt;&lt; \"write error: \" &lt;&lt; errno;         std::abort();       }     }   }    char* GetBuffer(int buffer_id) {     return buffers_[buffer_id];   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438.   \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0441\u0430\u043c \u0432\u044b\u0432\u043e\u0434 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430   \/\/ \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.   int NextBufferId() {     buffer_id_ = (buffer_id_ + 1) % 3;     return buffer_id_;   }    static constexpr int64_t BufferSize() {     return kBufferSize;   }   private:   \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 |out_bytes|.   size_t TargetPipeSize(size_t out_bytes) const {     \/\/ \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c \u0434\u0432\u043e\u0439\u043a\u0438 \u0438 >= 4 \u041a\u0411 \u0432 Linux.     \/\/ \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u044b\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 (\u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e     \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c |out_bytes| \u0432\u0432\u0435\u0440\u0445 \u0434\u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439     \/\/ \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438.     return std::max(4ul * 1024, std::bit_ceil(out_bytes));   }    void OutputWithVmSplice(char* buffer, size_t bytes) const {     iovec iov;     iov.iov_base = buffer;     iov.iov_len = bytes;     while (true) {       int64_t ret = vmsplice(STDOUT_FILENO, &amp;iov, 1, SPLICE_F_NONBLOCK);       if (ret >= 0) {         iov.iov_len -= ret;         iov.iov_base = reinterpret_cast&lt;char*>(iov.iov_base) + ret;         if (iov.iov_len == 0) {           break;         }       } else {         if (errno != EAGAIN) {           std::cerr &lt;&lt; \"vmsplice error: \" &lt;&lt; errno;           std::abort();         }       }     }   }    void SetPipeSize(size_t size) {     if (pipe_size_ == size) {       return;     }     size_t new_pipe_size = fcntl(STDOUT_FILENO, F_SETPIPE_SZ, size);     if (new_pipe_size &lt; 0) {       std::cerr &lt;&lt; \"Error while calling fcntl F_SETPIPE_SZ \" &lt;&lt; errno       &lt;&lt; \"\\nPerhaps you need to update \/proc\/sys\/fs\/pipe-max-size or \"          \"run the program as sudo\";       std::abort();     }      pipe_size_ = new_pipe_size;   }    std::array&lt;char*, 3> buffers_;   int buffer_id_ = 0;   size_t pipe_size_; };  \/\/ \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 fizzbuzz \u0434\u043b\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 |line| \u0438 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \/\/ \u0432 |out|. \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. char* InsertFizzBuzzLine(char* out, int64_t line) {   if (line % 15 == 0) {     std::memcpy(out, \"FizzBuzz\\n\", 9);     return out + 9;   } else if (line % 3 == 0) {     std::memcpy(out, \"Fizz\\n\", 5);     return out + 5;   } else if (line % 5 == 0) {     std::memcpy(out, \"Buzz\\n\", 5);     return out + 5;   } else {     \/\/ \u041c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e 10^20.     char* next = std::to_chars(out, out + 20, line).ptr;     *next = '\\n';     return next + 1;   } }  \/\/ \u041f\u0440\u043e\u0433\u043e\u043d (Run) - \u044d\u0442\u043e \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 |DIGITS| \u0446\u0438\u0444\u0440. \/\/ Run&lt;1>: [1,9] \/\/ Run&lt;2>: [10,99] \/\/ ... template&lt;int DIGITS> class Run {    static_assert(DIGITS >= 1);    static constexpr int FizzBuzzLineLength(int64_t number_mod_15) {     if (number_mod_15 % 15 == 0) {       return 9;     } else if (number_mod_15 % 3 == 0) {       return 5;     } else if (number_mod_15 % 5 == 0) {       return 5;     } else {       return DIGITS + 1;     }   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e fifteener \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.   static constexpr size_t FifteenerBytes() {     size_t size = 0;     for (int i = 0; i &lt; 15; ++i) {       size += FizzBuzzLineLength(i);     }     return size;   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435.   static constexpr int64_t LinesInRun() {     return PowTen(DIGITS) - PowTen(DIGITS - 1);   }    \/\/ \u0412\u0435\u0441\u044c \u0432\u044b\u0432\u043e\u0434 fizz-buzz \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432.   static constexpr size_t RunBytes() {     if constexpr(DIGITS == 1) {       return 5 + 3 * kFizzLength + 1 * kBuzzLength + 9 * kNewlineLength;     } else {       return LinesInRun() \/ 15 * FifteenerBytes();     }   }    \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435.   static constexpr int64_t BatchesInRun() {     if constexpr (DIGITS > kSuffixDigits) {       return PowTen(DIGITS - kSuffixDigits - 1) * 9;     } else {       return 1;     }   }   public:   \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0443\u0444\u0435\u0440\u044b \u0438\u0437 |output_handler|.   static void Execute(OutputHandler&amp; output_handler) {     Batch&lt;0> batch0(&amp;output_handler);     Batch&lt;1><\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-368688","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/368688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=368688"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/368688\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=368688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=368688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=368688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}