<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>moiLaird</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://moilaird.github.io/</id>
  <link href="https://moilaird.github.io/" rel="alternate"/>
  <link href="https://moilaird.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, moiLaird</rights>
  <subtitle>on Life and Learning</subtitle>
  <title>Laird Notes</title>
  <updated>2026-05-08T00:22:43.985Z</updated>
  <entry>
    <author>
      <name>moiLaird</name>
    </author>
    <category term="OJ" scheme="https://moilaird.github.io/categories/OJ/"/>
    <category term="Partition" scheme="https://moilaird.github.io/tags/Partition/"/>
    <category term="C++" scheme="https://moilaird.github.io/tags/C/"/>
    <category term="Python" scheme="https://moilaird.github.io/tags/Python/"/>
    <category term="整数分拆" scheme="https://moilaird.github.io/tags/%E6%95%B4%E6%95%B0%E5%88%86%E6%8B%86/"/>
    <category term="数论" scheme="https://moilaird.github.io/tags/%E6%95%B0%E8%AE%BA/"/>
    <content>
      <![CDATA[<p><a href="http://poj.org/problem?id=1032">POJ 1032</a> 是一个数论问题：给定一个正整数 <span class="math inline">\(n \geq 5\)</span>，求一个整数数列 <span class="math inline">\(A = (a_1,a_2, \cdots, a_k)\)</span>，满足 <span class="math inline">\(\sum_i a_i = n\)</span> 和 <span class="math inline">\(0 &lt; a_1 &lt; a_2 &lt; \cdots &lt; a_k\)</span>，且 <span class="math inline">\(\prod_i a_i\)</span>最大。</p><p><span class="math inline">\(A\)</span> 有以下性质：<br />1. <span class="math inline">\(a_1 &gt; 1\)</span>，因为 <span class="math inline">\(1 \cdot a_i &lt; 1 + a_i\)</span><br />2. <span class="math inline">\(a_1 \leq 3\)</span>，因为如果 <span class="math inline">\(a_1 &gt;  3, a_1 \cdot a_2 &lt; 2  \cdot (a_1 - 1) \cdot (a_2 - 1)\)</span><br />3. 项数尽可能多，因为 <span class="math inline">\(2 \leq a_p &lt; a_q, a_p + a_q &lt; a_p \cdot a_q\)</span></p><span id="more"></span><p>猜想 <span class="math inline">\(A\)</span> 的形式接近 <span class="math inline">\(T = (2, 3, \cdots, m)\)</span>。<br />记 <span class="math inline">\(T(m) = \sum_{i=2}^m i = \frac{m(m+1)}{2} - 1\)</span>，存在唯一的 <span class="math inline">\(m = \lfloor \frac{\sqrt{8n+9} - 1}{2} \rfloor\)</span> 使得 <span class="math inline">\(T(m) \leq n &lt; T(m+1)\)</span>。设 <span class="math inline">\(n = T(m) + l, 0 \leq l \leq m\)</span>。</p><p>用<span class="math inline">\(\{T\}\)</span>表示数列<span class="math inline">\(T\)</span>的各项组成的有序集合，即 <span class="math inline">\(\{T\} = \{2, 3, \cdots, m\}\)</span>。<br /><a href="https://cs.uwaterloo.ca/journals/JIS/VOL8/Doslic/doslic15.html">Maximum Product Over Partitions Into Distinct Parts</a> 这篇论文证明了所求数列（用集合表示）为 <span class="math display">\[\{A\} = \begin{cases}\{T\} &amp; , &amp; l = 0\\\{T\} - \{2\} + \{m+2\} &amp; , &amp; l = m\\\{T\} - \{m-l+1\} + \{m+1\} &amp; , &amp; 1 \leq l \leq m-1\end{cases}\]</span> 数列长度为 <span class="math inline">\(m-1\)</span>。即将 <span class="math inline">\(l\)</span> 个1分别加到 <span class="math inline">\(T\)</span> 的倒数 <span class="math inline">\(l\)</span> 项，其中 <span class="math inline">\(l = m\)</span> 时多出一个1加到最后一项。</p><p>C++代码实现如下。 <figure class="highlight c++"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;set&gt;</span></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">    <span class="type">int</span> n, m, Tm, l;</span><br><span class="line">    std::set&lt;<span class="type">int</span>&gt; A;</span><br><span class="line">    std::cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    m = <span class="built_in">static_cast</span>&lt;<span class="type">int</span>&gt; ((<span class="built_in">sqrt</span>(<span class="number">8</span> * n + <span class="number">9</span>) - <span class="number">1</span>) / <span class="number">2.0</span>);</span><br><span class="line">    Tm = m * (m + <span class="number">1</span>) / <span class="number">2</span> - <span class="number">1</span>;</span><br><span class="line">    l = n - Tm;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">2</span>; i &lt;= m; ++i) &#123;</span><br><span class="line">        A.<span class="built_in">insert</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (l &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (l == m) &#123;</span><br><span class="line">            A.<span class="built_in">erase</span>(<span class="number">2</span>);</span><br><span class="line">            A.<span class="built_in">insert</span>(m + <span class="number">2</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            A.<span class="built_in">erase</span>(m - l + <span class="number">1</span>);</span><br><span class="line">            A.<span class="built_in">insert</span>(m + <span class="number">1</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">for</span> (<span class="keyword">auto</span> el : A) &#123;</span><br><span class="line">        std::cout &lt;&lt; el &lt;&lt; <span class="string">&#x27; &#x27;</span>;</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></p><hr /><p><strong>Update</strong></p><p>发现 <a href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2037">ZOJ 2037</a> 是同一题，不过输入包含多个 case。<br />ZOJ 支持 Python。我有点好奇 Python 比 C/C++ 慢多少，于是提交了以下代码。</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><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> sqrt</span><br><span class="line"><span class="keyword">from</span> sys <span class="keyword">import</span> stdin, stdout</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">part</span>(<span class="params">n</span>):</span><br><span class="line">    m = <span class="built_in">int</span>((sqrt(<span class="number">8</span> * n + <span class="number">9</span>) - <span class="number">1</span>) / <span class="number">2</span>)</span><br><span class="line">    tm = m * (m + <span class="number">1</span>) // <span class="number">2</span> - <span class="number">1</span></span><br><span class="line">    l = n - tm</span><br><span class="line">    a = <span class="built_in">list</span>(<span class="built_in">range</span>(<span class="number">2</span>, m + <span class="number">1</span>))</span><br><span class="line">    <span class="keyword">if</span> l &gt; <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">if</span> l == m:</span><br><span class="line">            <span class="keyword">del</span> a[<span class="number">0</span>]</span><br><span class="line">            a.append(m + <span class="number">2</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">del</span> a[m - l - <span class="number">1</span>]</span><br><span class="line">            a.append(m + <span class="number">1</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27; &#x27;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, a))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">data = <span class="built_in">map</span>(<span class="built_in">int</span>, stdin.read().split()[<span class="number">1</span>:])</span><br><span class="line">stdout.write(<span class="string">&#x27;\n\n&#x27;</span>.join(part(x) <span class="keyword">for</span> x <span class="keyword">in</span> data))</span><br></pre></td></tr></table></figure><p>结果是 AC，Time 0 ms，Memory 144 KB。咦，排在 C 前面？<br />然而我再重复了几次，Time 都是 10 ms。看来不用太纠结那么多 0 ms 怎么来的～</p><hr /><p><strong>相关问题</strong></p><ul><li>IMO 1976/4. Determine the largest number which is the product of positive integers with sum 1976. (Answer: <span class="math inline">\(1976 = 3 \cdot 658 + 2, M = 2 \cdot 3^{658}\)</span>)</li><li><a href="https://leetcode.com/problems/integer-break">LeetCode 343. Integer Break</a></li><li><a href="https://projecteuler.net/problem=374">Project Euler Problem 374. Maximum Integer Partition Product</a></li></ul><hr /><p><strong>附件</strong></p><ul><li><a href="/files/NEERC-1998-D.RTF">NEERC 1998 Problem D</a></li><li><a href="/files/PARLIAM.PAS">Sample Solution</a></li></ul>]]>
    </content>
    <id>https://moilaird.github.io/2017/04/integer-partition/</id>
    <link href="https://moilaird.github.io/2017/04/integer-partition/"/>
    <published>2017-04-11T17:35:47.000Z</published>
    <summary>
      <![CDATA[<p><a href="http://poj.org/problem?id=1032">POJ 1032</a> 是一个数论问题：给定一个正整数 <span class="math inline">\(n \geq 5\)</span>，求一个整数数列 <span class="math inline">\(A = (a_1,a_2, \cdots, a_k)\)</span>，满足 <span class="math inline">\(\sum_i a_i = n\)</span> 和 <span class="math inline">\(0 &lt; a_1 &lt; a_2 &lt; \cdots &lt; a_k\)</span>，且 <span class="math inline">\(\prod_i a_i\)</span>最大。</p>
<p><span class="math inline">\(A\)</span> 有以下性质：<br />
1. <span class="math inline">\(a_1 &gt; 1\)</span>，因为 <span class="math inline">\(1 \cdot a_i &lt; 1 + a_i\)</span><br />
2. <span class="math inline">\(a_1 \leq 3\)</span>，因为如果 <span class="math inline">\(a_1 &gt;  3, a_1 \cdot a_2 &lt; 2  \cdot (a_1 - 1) \cdot (a_2 - 1)\)</span><br />
3. 项数尽可能多，因为 <span class="math inline">\(2 \leq a_p &lt; a_q, a_p + a_q &lt; a_p \cdot a_q\)</span></p>]]>
    </summary>
    <title>整数分拆使乘积最大</title>
    <updated>2026-05-08T00:22:43.985Z</updated>
  </entry>
  <entry>
    <author>
      <name>moiLaird</name>
    </author>
    <category term="Miscellaneous" scheme="https://moilaird.github.io/categories/Miscellaneous/"/>
    <category term="Ubuntu" scheme="https://moilaird.github.io/tags/Ubuntu/"/>
    <category term="Unity" scheme="https://moilaird.github.io/tags/Unity/"/>
    <category term="bug" scheme="https://moilaird.github.io/tags/bug/"/>
    <category term="桌面" scheme="https://moilaird.github.io/tags/%E6%A1%8C%E9%9D%A2/"/>
    <content>
      <![CDATA[<p>最近笔记本上的Ubuntu 16.04经常出现同一个bug：登录后桌面空空如也，没有Launcher，只显示一张壁纸，没法用～</p><p>解决办法很简单。按<code>CTRL</code>+<code>ALT</code>+<code>F2</code>（F1到F6都可以）打开一个虚拟终端，输入用户名和密码登录。然后输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -rf ~/.compiz ~/.cache</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart lightdm</span><br></pre></td></tr></table></figure><span id="more"></span><p>重新登录后桌面恢复正常。</p><p>过去这个bug大概一年遇到一两次，最近频繁出现。不知是否和安装了搜狗输入法 for Linux有关。记得搜狗的某个版本会使得Ubuntu在注销时卡死。</p><p>今天刚看到3天前的新闻：<a href="https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/">Ubuntu宣布放弃Unity</a>，明年回归GNOME桌面。真是个喜闻乐见的好消息。希望Ubuntu也能用上Wayland :-)</p>]]>
    </content>
    <id>https://moilaird.github.io/2017/04/ubuntu-blank-desktop/</id>
    <link href="https://moilaird.github.io/2017/04/ubuntu-blank-desktop/"/>
    <published>2017-04-08T15:47:01.000Z</published>
    <summary>
      <![CDATA[<p>最近笔记本上的Ubuntu 16.04经常出现同一个bug：登录后桌面空空如也，没有Launcher，只显示一张壁纸，没法用～</p>
<p>解决办法很简单。按<code>CTRL</code>+<code>ALT</code>+<code>F2</code>（F1到F6都可以）打开一个虚拟终端，输入用户名和密码登录。然后输入以下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -rf ~/.compiz ~/.cache</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart lightdm</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>Ubuntu登录后只显示壁纸的修复方法</title>
    <updated>2026-05-08T00:22:38.981Z</updated>
  </entry>
  <entry>
    <author>
      <name>moiLaird</name>
    </author>
    <category term="Tools" scheme="https://moilaird.github.io/categories/Tools/"/>
    <category term="LaTeX" scheme="https://moilaird.github.io/tags/LaTeX/"/>
    <category term="CircuiTikZ" scheme="https://moilaird.github.io/tags/CircuiTikZ/"/>
    <category term="SVG" scheme="https://moilaird.github.io/tags/SVG/"/>
    <category term="电路图" scheme="https://moilaird.github.io/tags/%E7%94%B5%E8%B7%AF%E5%9B%BE/"/>
    <content>
      <![CDATA[<p>有一次做PPT的时候需要插入一张简单的电路图。</p><p>我懒得为此在自己电脑上安装一款EDA软件（说的好像买得起license一样）。<br />盯着桌面图标发呆时隐约想起可以画分子结构式的LaTeX好像也可以画电路原理图。<br />Google搜索”latex circuit”，<a href="https://www.ctan.org/pkg/circuitikz">CircuiTikZ</a>这个宏包占据了结果的第一页。<br />于是看了会<a href="https://www.sharelatex.com/learn/CircuiTikz_package">ShareLaTeX</a>上的教程，好像不是很难的样子，图的效果也挺顺眼，让我回忆起那些年用过的电路教材。决定就是她了。</p><p>大致浏览了一下manual，然后跳到Examples那节，照猫画虎，一会儿就画好啦。最终效果长这样。</p><figure><img src="/img/circuitikz.svg" alt="Equivalent Circuit of RPI Poly-Si TFT Model" /><figcaption aria-hidden="true">Equivalent Circuit of RPI Poly-Si TFT Model</figcaption></figure><span id="more"></span><p>使用的LaTeX代码如下。</p><figure class="highlight tex"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">\documentclass</span>&#123;standalone&#125;</span><br><span class="line"><span class="keyword">\usepackage</span>[american,smartlabels]&#123;circuitikz&#125;</span><br><span class="line"><span class="keyword">\begin</span>&#123;document&#125;</span><br><span class="line">    <span class="keyword">\begin</span>&#123;circuitikz&#125;</span><br><span class="line">        <span class="keyword">\draw</span> (0,0) to [C=<span class="built_in">$</span>C<span class="built_in">_</span>&#123;gs&#125;<span class="built_in">$</span>] (0,1.5) to [R=<span class="built_in">$</span>R<span class="built_in">_</span>&#123;sx&#125;<span class="built_in">$</span>] (0,4) --</span><br><span class="line">              (4,4) to [R=<span class="built_in">$</span>R<span class="built_in">_</span>&#123;dx&#125;<span class="built_in">$</span>] (4,1.5) to [C=<span class="built_in">$</span>C<span class="built_in">_</span>&#123;gd&#125;<span class="built_in">$</span>] (4,0);</span><br><span class="line">        <span class="keyword">\draw</span> (-3,0) node [anchor=east] &#123;S&#125; to [R, l<span class="built_in">_</span>=<span class="built_in">$</span>R<span class="built_in">_</span>&#123;s&#125;<span class="built_in">$</span>, o-*]</span><br><span class="line">              (0,0) to [I&lt;=<span class="built_in">$</span>I<span class="built_in">_</span>&#123;ds&#125;<span class="built_in">$</span>, *-*] (4,0)</span><br><span class="line">              to [R, l<span class="built_in">_</span>=<span class="built_in">$</span>R<span class="built_in">_</span>&#123;d&#125;<span class="built_in">$</span>, *-o] (7,0) node [anchor=west] &#123;D&#125;;</span><br><span class="line">        <span class="keyword">\draw</span> (2,4) to [short, *-o] (2,5) node [anchor=south] &#123;G&#125;;</span><br><span class="line">    <span class="keyword">\end</span>&#123;circuitikz&#125;</span><br><span class="line"><span class="keyword">\end</span>&#123;document&#125;</span><br></pre></td></tr></table></figure><p>和TikZ的语法相似，用坐标描述点的位置，用导线连接电阻、电容、电流源等元件。<br />代码中的<code>anchor</code>用于标注外部连接。</p><p>用XeLaTeX编译得到PDF文件，然后用Inkscape转换成其他矢量图形格式比如SVG或EMF。<br />好消息是Office 2016支持插入SVG 图像了。</p>]]>
    </content>
    <id>https://moilaird.github.io/2017/04/circuitikz/</id>
    <link href="https://moilaird.github.io/2017/04/circuitikz/"/>
    <published>2017-04-03T12:39:51.000Z</published>
    <summary>
      <![CDATA[<p>有一次做PPT的时候需要插入一张简单的电路图。</p>
<p>我懒得为此在自己电脑上安装一款EDA软件（说的好像买得起license一样）。<br />
盯着桌面图标发呆时隐约想起可以画分子结构式的LaTeX好像也可以画电路原理图。<br />
Google搜索”latex circuit”，<a href="https://www.ctan.org/pkg/circuitikz">CircuiTikZ</a>这个宏包占据了结果的第一页。<br />
于是看了会<a href="https://www.sharelatex.com/learn/CircuiTikz_package">ShareLaTeX</a>上的教程，好像不是很难的样子，图的效果也挺顺眼，让我回忆起那些年用过的电路教材。决定就是她了。</p>
<p>大致浏览了一下manual，然后跳到Examples那节，照猫画虎，一会儿就画好啦。最终效果长这样。</p>
<figure>
<img src="/img/circuitikz.svg" alt="Equivalent Circuit of RPI Poly-Si TFT Model" />
<figcaption aria-hidden="true">Equivalent Circuit of RPI Poly-Si TFT Model</figcaption>
</figure>]]>
    </summary>
    <title>LaTeX画电路图之CircuiTikZ</title>
    <updated>2026-05-08T00:22:47.789Z</updated>
  </entry>
  <entry>
    <author>
      <name>moiLaird</name>
    </author>
    <category term="Mathematics" scheme="https://moilaird.github.io/categories/Mathematics/"/>
    <category term="Pi" scheme="https://moilaird.github.io/tags/Pi/"/>
    <category term="圆周率" scheme="https://moilaird.github.io/tags/%E5%9C%86%E5%91%A8%E7%8E%87/"/>
    <category term="级数" scheme="https://moilaird.github.io/tags/%E7%BA%A7%E6%95%B0/"/>
    <category term="积分" scheme="https://moilaird.github.io/tags/%E7%A7%AF%E5%88%86/"/>
    <category term="欧拉变换" scheme="https://moilaird.github.io/tags/%E6%AC%A7%E6%8B%89%E5%8F%98%E6%8D%A2/"/>
    <content>
      <![CDATA[<p>求以下级数的和：</p><p><span class="math display">\[S_n = \sum_{n=0}^{\infty} \frac{n!}{(2n+1)!!}\]</span></p><span id="more"></span><p>解：考虑积分</p><p><span class="math display">\[\int_{0}^{1} (1 - x^2)^n d x = \int_{0}^{\frac{\pi}{2}} \sin^{2n+1} t d t = \frac{(2n)!!}{(2n+1)!!}\]</span></p><p>通项</p><p><span class="math display">\[\frac{n!}{(2n+1)!!} = \frac{1}{2^n} \frac{(2n)!!}{(2n+1)!!} = \frac{1}{2^n} \int_{0}^{1} (1 - x^2)^n d x = \int_{0}^{1} (\frac{1 - x^2}{2})^n d x\]</span></p><p>交换求和与积分的顺序得</p><p><span class="math display">\[\begin{align*}  S_n &amp;= \sum_{n=0}^{\infty} \left\{ \int_{0}^{1} (\frac{1 - x^2}{2})^n d x \right\} = \int_{0}^{1} \left\{ \sum_{n=0}^{\infty} (\frac{1 - x^2}{2})^n \right\} d x \\      &amp;= \int_{0}^{1} \frac{2}{1 + x^2} d x = \frac{\pi}{2}\end{align*}\]</span></p><p>另解：利用莱布尼茨级数的<strong><a href="http://mathworld.wolfram.com/EulerTransform.html">欧拉变换</a></strong>可得</p><p><span class="math display">\[\frac{\pi}{4} = \sum_{n=0}^{\infty} \frac{(-1)^n}{2n+1} = \frac{1}{2} \sum_{n=0}^{\infty} \frac{n!}{(2n+1)!!}\]</span></p>]]>
    </content>
    <id>https://moilaird.github.io/2017/04/pi-series/</id>
    <link href="https://moilaird.github.io/2017/04/pi-series/"/>
    <published>2017-04-01T06:15:16.000Z</published>
    <summary>
      <![CDATA[<p>求以下级数的和：</p>
<p><span class="math display">\[
S_n = \sum_{n=0}^{\infty} \frac{n!}{(2n+1)!!}
\]</span></p>]]>
    </summary>
    <title>Pi 的一种级数表示</title>
    <updated>2026-05-08T00:22:33.561Z</updated>
  </entry>
  <entry>
    <author>
      <name>moiLaird</name>
    </author>
    <category term="Programming" scheme="https://moilaird.github.io/categories/Programming/"/>
    <category term="SQL" scheme="https://moilaird.github.io/tags/SQL/"/>
    <category term="Pivot Table" scheme="https://moilaird.github.io/tags/Pivot-Table/"/>
    <category term="crosstab" scheme="https://moilaird.github.io/tags/crosstab/"/>
    <category term="ROW_NUMBER" scheme="https://moilaird.github.io/tags/ROW-NUMBER/"/>
    <category term="透视表" scheme="https://moilaird.github.io/tags/%E9%80%8F%E8%A7%86%E8%A1%A8/"/>
    <category term="分组排序" scheme="https://moilaird.github.io/tags/%E5%88%86%E7%BB%84%E6%8E%92%E5%BA%8F/"/>
    <content>
      <![CDATA[<p>上周去面试了某电商的数据分析师职位。<br />面试前几天临时抱佛脚看完了3年前买的《SQL必知必会》。不过最后还是跪在了2道SQL题目上。<br />Google之后发现2道题分别代表一类常见的查询。都是套路啊～</p><hr /><p><strong>问题描述</strong>：以AMD和Intel近5年的Revenue数据为例。首先创建表和插入数据。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">-- MySQL, PostgreSQL, SQL Server</span></span><br><span class="line"><span class="keyword">CREATE TABLE</span> financials (</span><br><span class="line">    company_name <span class="type">VARCHAR</span>(<span class="number">10</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    fiscal_year <span class="type">SMALLINT</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    revenue <span class="type">DECIMAL</span>(<span class="number">10</span>,<span class="number">2</span>) <span class="keyword">NOT NULL</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">INSERT INTO</span> financials (company_name, fiscal_year, revenue) <span class="keyword">VALUES</span></span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2012</span>, <span class="number">5.42</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2013</span>, <span class="number">5.30</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2014</span>, <span class="number">5.51</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2015</span>, <span class="number">3.99</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2016</span>, <span class="number">4.27</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2012</span>, <span class="number">53.34</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2013</span>, <span class="number">52.71</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2014</span>, <span class="number">55.87</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2015</span>, <span class="number">55.36</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2016</span>, <span class="number">59.39</span>);</span><br></pre></td></tr></table></figure></p><span id="more"></span><hr /><p><strong>Q1</strong>: 将原始的表转换成如下形式。</p><table><thead><tr><th style="text-align: left;">Company</th><th style="text-align: right;">2012</th><th style="text-align: right;">2013</th><th style="text-align: right;">2014</th><th style="text-align: right;">2015</th><th style="text-align: right;">2016</th></tr></thead><tbody><tr><td style="text-align: left;">AMD</td><td style="text-align: right;">5.42</td><td style="text-align: right;">5.3</td><td style="text-align: right;">5.51</td><td style="text-align: right;">3.99</td><td style="text-align: right;">4.27</td></tr><tr><td style="text-align: left;">Intel</td><td style="text-align: right;">53.3</td><td style="text-align: right;">52.7</td><td style="text-align: right;">55.9</td><td style="text-align: right;">55.4</td><td style="text-align: right;">59.4</td></tr></tbody></table><p><strong>A1</strong>: 这是行转列，或者说创建透视表(pivot table) / 列联表(cross tabulation)的操作。<br />标准SQL可以用<code>CASE</code>语句来实现。MySQL的<code>IF</code>和Oracle的<code>DECODE</code>可以代替<code>CASE</code>。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">-- MySQL, PostgreSQL, SQL Server, Oracle</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line">    company_name <span class="keyword">AS</span> Company,</span><br><span class="line">    <span class="built_in">SUM</span>(<span class="keyword">CASE</span> <span class="keyword">WHEN</span> fiscal_year <span class="operator">=</span> <span class="number">2012</span> <span class="keyword">THEN</span> revenue <span class="keyword">END</span>) <span class="keyword">AS</span> &quot;2012&quot;,</span><br><span class="line">    <span class="built_in">SUM</span>(<span class="keyword">CASE</span> <span class="keyword">WHEN</span> fiscal_year <span class="operator">=</span> <span class="number">2013</span> <span class="keyword">THEN</span> revenue <span class="keyword">END</span>) <span class="keyword">AS</span> &quot;2013&quot;,</span><br><span class="line">    <span class="built_in">SUM</span>(<span class="keyword">CASE</span> <span class="keyword">WHEN</span> fiscal_year <span class="operator">=</span> <span class="number">2014</span> <span class="keyword">THEN</span> revenue <span class="keyword">END</span>) <span class="keyword">AS</span> &quot;2014&quot;,</span><br><span class="line">    <span class="built_in">SUM</span>(<span class="keyword">CASE</span> <span class="keyword">WHEN</span> fiscal_year <span class="operator">=</span> <span class="number">2015</span> <span class="keyword">THEN</span> revenue <span class="keyword">END</span>) <span class="keyword">AS</span> &quot;2015&quot;,</span><br><span class="line">    <span class="built_in">SUM</span>(<span class="keyword">CASE</span> <span class="keyword">WHEN</span> fiscal_year <span class="operator">=</span> <span class="number">2016</span> <span class="keyword">THEN</span> revenue <span class="keyword">END</span>) <span class="keyword">AS</span> &quot;2016&quot;</span><br><span class="line"><span class="keyword">FROM</span> financials</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> company_name;</span><br></pre></td></tr></table></figure></p><p><a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot">SQL Server</a>提供了<code>PIVOT</code>操作符来简化一串<code>SELECT...CASE</code>语句。Oracle也支持<code>PIVOT</code>。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">-- SQL Server</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line">    company_name <span class="keyword">AS</span> Company,</span><br><span class="line">    [<span class="number">2012</span>], [<span class="number">2013</span>], [<span class="number">2014</span>], [<span class="number">2015</span>], [<span class="number">2016</span>]</span><br><span class="line"><span class="keyword">FROM</span> financials</span><br><span class="line">PIVOT</span><br><span class="line">(</span><br><span class="line">    <span class="built_in">SUM</span>(revenue) <span class="keyword">FOR</span> fiscal_year <span class="keyword">IN</span> ([<span class="number">2012</span>], [<span class="number">2013</span>], [<span class="number">2014</span>], [<span class="number">2015</span>], [<span class="number">2016</span>])</span><br><span class="line">) <span class="keyword">AS</span> PivotTable</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> company_name;</span><br></pre></td></tr></table></figure></p><p>PostgreSQL的<a href="https://www.postgresql.org/docs/current/static/tablefunc.html">tablefunc</a>模块提供了类似功能的<code>crosstab</code>函数。 <figure class="highlight sql"><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"><span class="keyword">CREATE</span> extension tablefunc;</span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">FROM</span> crosstab(<span class="string">&#x27;SELECT company_name, fiscal_year, revenue FROM financials ORDER BY 1,2&#x27;</span>)</span><br><span class="line">     <span class="keyword">AS</span> ct(Company <span class="type">VARCHAR</span>, &quot;2012&quot; <span class="type">DECIMAL</span>, &quot;2013&quot; <span class="type">DECIMAL</span>, &quot;2014&quot; <span class="type">DECIMAL</span>, &quot;2015&quot; <span class="type">DECIMAL</span>, &quot;2016&quot; <span class="type">DECIMAL</span>)</span><br></pre></td></tr></table></figure></p><hr /><p><strong>Q2</strong>: 列出每家公司Revenue第二多的年份。</p><p><strong>A2</strong>: 最简单的方法是使用窗口函数。<br />PostgreSQL, <a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql">SQL Server</a>, Oracle支持<code>ROW_NUMBER</code>函数，MySQL不支持。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">-- PostgreSQL, SQL Server</span></span><br><span class="line"><span class="keyword">SELECT</span> company_name, fiscal_year, revenue</span><br><span class="line"><span class="keyword">FROM</span>   (<span class="keyword">SELECT</span> <span class="operator">*</span>,</span><br><span class="line">               <span class="built_in">ROW_NUMBER</span>() <span class="keyword">OVER</span> (<span class="keyword">PARTITION</span> <span class="keyword">BY</span> company_name <span class="keyword">ORDER</span> <span class="keyword">BY</span> revenue <span class="keyword">DESC</span>) <span class="keyword">AS</span> row_num</span><br><span class="line">        <span class="keyword">FROM</span> financials ) <span class="keyword">AS</span> ranked</span><br><span class="line"><span class="keyword">WHERE</span> row_num <span class="operator">=</span> <span class="number">2</span>;</span><br></pre></td></tr></table></figure></p><p>MySQL可以使用变量来实现分组排序。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> company_name, fiscal_year, revenue</span><br><span class="line"><span class="keyword">FROM</span>   (<span class="keyword">SELECT</span> <span class="operator">*</span>,</span><br><span class="line">               <span class="variable">@rank</span> :<span class="operator">=</span> IF(<span class="variable">@company</span> <span class="operator">=</span> company_name, <span class="variable">@rank</span> <span class="operator">+</span> <span class="number">1</span>, <span class="number">1</span>) <span class="keyword">AS</span> row_num,</span><br><span class="line">               <span class="variable">@company</span> :<span class="operator">=</span> company_name</span><br><span class="line">        <span class="keyword">FROM</span>   financials</span><br><span class="line">        <span class="keyword">ORDER</span>  <span class="keyword">BY</span> company_name, revenue <span class="keyword">DESC</span>) <span class="keyword">AS</span> ranked</span><br><span class="line"><span class="keyword">WHERE</span>  row_num <span class="operator">=</span> <span class="number">2</span>;</span><br></pre></td></tr></table></figure></p><hr /><p><strong>P.S.</strong></p><ul><li>《SQL必知必会》的内容很基础，没有<code>CASE</code>语句、<code>PIVOT</code>、窗口函数等。 后来在书城看到《SQL基础教程》，觉得更适合入门。<br /></li><li>发现MySQL相比其他关系数据库缺少一些有用的特性。</li></ul>]]>
    </content>
    <id>https://moilaird.github.io/2017/03/sql-interview/</id>
    <link href="https://moilaird.github.io/2017/03/sql-interview/"/>
    <published>2017-03-30T06:15:16.000Z</published>
    <summary>
      <![CDATA[<p>上周去面试了某电商的数据分析师职位。<br />
面试前几天临时抱佛脚看完了3年前买的《SQL必知必会》。不过最后还是跪在了2道SQL题目上。<br />
Google之后发现2道题分别代表一类常见的查询。都是套路啊～</p>
<hr />
<p><strong>问题描述</strong>：以AMD和Intel近5年的Revenue数据为例。首先创建表和插入数据。 <figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">-- MySQL, PostgreSQL, SQL Server</span></span><br><span class="line"><span class="keyword">CREATE TABLE</span> financials (</span><br><span class="line">    company_name <span class="type">VARCHAR</span>(<span class="number">10</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">    fiscal_year <span class="type">SMALLINT</span> <span class="keyword">NOT NULL</span>,</span><br><span class="line">    revenue <span class="type">DECIMAL</span>(<span class="number">10</span>,<span class="number">2</span>) <span class="keyword">NOT NULL</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">INSERT INTO</span> financials (company_name, fiscal_year, revenue) <span class="keyword">VALUES</span></span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2012</span>, <span class="number">5.42</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2013</span>, <span class="number">5.30</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2014</span>, <span class="number">5.51</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2015</span>, <span class="number">3.99</span>),</span><br><span class="line">    (<span class="string">&#x27;AMD&#x27;</span>, <span class="number">2016</span>, <span class="number">4.27</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2012</span>, <span class="number">53.34</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2013</span>, <span class="number">52.71</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2014</span>, <span class="number">55.87</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2015</span>, <span class="number">55.36</span>),</span><br><span class="line">    (<span class="string">&#x27;Intel&#x27;</span>, <span class="number">2016</span>, <span class="number">59.39</span>);</span><br></pre></td></tr></table></figure></p>]]>
    </summary>
    <title>SQL面试题</title>
    <updated>2026-05-08T00:22:19.307Z</updated>
  </entry>
</feed>
