Long Luo's Life Notes

每一天都是奇迹

By Long Luo

最近在短视频 App 里刷到不少中学数学题讲解,才发现现在的初中数学题,很多已经不只是“会算”这么简单了,背后往往还藏着不等式、函数、几何直觉等不同层面的思维训练。

当然,这也不算奇怪,几十年前的 IMO 试题放现在也就普通题。很多经典数学竞赛题,随着时间推移和教学资源普及,早已从高阶技巧逐渐变成了基础训练的一部分。

前几天我就反复刷到一道“求极值”的题,看起来不难,但这道题其实非常适合拿来练习数学直觉。

已知 \(x + y = 5\) ,求 \(\sqrt {x + 1} + \sqrt {y + 3}\) 的最大值。

这道题的有趣之处在于可以用很多完全不同的思路来解决,有的解法只需要代数变形和基本不等式,但也可以使用几何视角、函数思想。

下面就道题为例,把几种典型解法都梳理一遍,也顺便重新锻炼一下自己的数学思维。

解法一:常规解法

\(y = 5 - x\) ,原式变成 \(\sqrt {x + 1} + \sqrt {8 - x}\) ,要保证根号有意义,所以 \(−1 \le x \le 8\)

\(S = \sqrt {x + 1} + \sqrt {8 - x}\) ,两边平方得 \(S^2 = (\sqrt{x + 1} + \sqrt{8 - x})^2\)

展开可得:

\[ \begin{aligned} S^2 & = (x + 1) + (8 - x) + 2 \sqrt {(x + 1)(8 - x)} \\ & = 9 + 2 \sqrt {(x + 1)(8 - x)} \\ & = 9 + 2 \sqrt {-x^2 + 7x + 8} \\ & = 9 + 2 \sqrt {-(x - \frac {7}{2})^2 + \frac {81}{4}} \end{aligned} \]

因此 \(S^2 \le 9 + 2 \times \dfrac {9}{2} = 18\) ,于是 \(S \le 3 \sqrt 2\) 当且仅当 \(x = \dfrac {7}{2}\) 时取等号。

故最大值为 \(3\sqrt2\)

阅读全文 »

By Long Luo

在上一篇文章我们剖析了 拼多多 2020 年校招笔试算法题中第一题: 多多的魔术盒子 ,今天来挑战下其中的第 4 题:骰子期望 1 ,题目如下:

骰子期望

\(n\) 个骰子,第 \(i\) 个骰子有可能投掷出 \(X_i\) 种等概率的不同的结果,数字从 \(1\)\(X_i\) 。所有骰子的结果的最大值将作为最终结果。求最终结果的期望。

  • 输入描述:
    • 第一行一个整数 \(n\) ,表示有 \(n\) 个骰子。( \(1 \le n \le 50\) )
    • 第二行 \(n\) 个整数,表示每个骰子的结果数 \(X_i\) 。( \(2 \le X_i \le 50\) )
  • 输出描述:
    • 输出最终结果的期望,保留两位小数。
  • 输入例子 \(1\) :
    • 2
    • 2 2
  • 输出例子 \(1\) :
    • 1.75

要解答这道题,我们需要先从脑海里把中学数学知识捡起来,弄清楚什么是期望 2

在概率论和统计学中,一个离散性随机变量的数学期望是试验中每次可能的结果乘以其结果概率的总和:

\[ \operatorname {E} [X] = \sum _{i=1}^{\infty }x_{i}\,p_{i} \tag{1} \label{1} \]

具体到这道题示例 \(1\) ,很明显 \(2\) 个骰子只能取到 \(1\) 或者 \(2\) 个值:

  1. 假设这 \(2\) 个骰子取到的最大值为 \(1\) ,那么这 \(2\) 个骰子都只能选择 \(1\) ,概率为: \(\dfrac {1}{2} \times \dfrac {1}{2} = \dfrac {1}{4}\)

  2. 假设这 \(2\) 个骰子取到的最大值为 \(2\) ,那么存在 \(2\) 种可能,要么都取 \(2\) 或者 \(2\) 个骰子中有一个骰子投出了 \(2\) ,其概率为: \(\dfrac {1}{2} \times \dfrac {1}{2} + \dfrac {1}{2} \times 1 = \dfrac {3}{4}\)

那么期望为: \(\dfrac {1}{4} \times 1 + \dfrac {3}{4} \times 2 = 1.75\)

对于骰子数少的时候还可以枚举,如果骰子数量很多呢?用上述方法就会遇到困难,比如有 \(N\) 个骰子,最大值为 \(M\) ,那么骰子结果为 \([1, 2, \dots, M]\) ,如何计算每个结果的概率值呢?

直接算当然是可行的,但是如果骰子数量很多的话,计算会非常繁琐,所以有没有更简单的方法呢?

阅读全文 »

By Long Luo

众多IT大厂中拼多多虽然工作强度很大,但在给钱方面非常大方。大厂给的钱多,但要求也高。下面就来挑战拼多多 2020 年校招笔试算法题 1 中第一题:多多的魔术盒子 2 ,看看难度如何。

多多的魔术盒子

多多鸡有 \(N\) 个魔术盒子(编号 \(1 \sim N\) ),其中编号为 \(i\) 的盒子里有 \(i\) 个球。多多鸡让皮皮虾每次选择一个数字 \(X\) ( \(1 \le X \le N\) ),多多鸡就会把球数量大于等于 \(X\) 个的盒子里的球减少 \(X\) 个。 通过观察,皮皮虾已经掌握了其中的奥秘,并且发现只要通过一定的操作顺序,可以用最少的次数将所有盒子里的球变没。

那么请问聪明的你,是否已经知道了应该如何操作呢?

  • 时间限制:

    • C/C++ 1秒,其他语言 2 秒
  • 空间限制:

    • C/C++ 256M,其他语言 512M
  • 输入描述:

    • 第一行,有 \(1\) 个整数 \(T\) ,表示测试用例的组数。 ( \(1 \le T \le 100\) )
    • 接下来 \(T\) 行,每行 \(1\) 个整数 \(N\) ,表示有 \(N\) 个魔术盒子。 ( \(1 \le N \le 1,000,000,000\) )
  • 输出描述:

    • \(T\) 行,每行 \(1\) 个整数,表示要将所有盒子的球变没,最少需要进行多少次操作。
  • 输入例子 1 :

    1
    2
    3
    4
    3
    1
    2
    5

  • 输出例子 1 :

    1
    2
    3
    1
    2
    3

最少的操作次数该怎么做?

根据题意,我们关键是要找到最少次数这个方法,那如何操作才能使用最少次数呢?

当面对复杂问题时,我们需要从简单情况入手,分析其中规律,找到突破口。

  1. \(N = 1\) 时,显然选择 \(X = 1\) ,需要 \(1\) 次操作;
  2. \(N = 2\) 时,可以先选择 \(X = 1\) ,再选择 \(X = 2\) ,需要 \(2\) 次操作;
  3. \(N = 3\) 时,只有先选择 \(X = 2\) ,再选择 \(X = 1\) ,最少需要 \(2\) 次操作;
  4. \(N = 4\) 时,可以先选择 \(X = 2\) 或者 \(X = 3\) ,最少需要 \(3\) 次操作;

通过分析发现,每次操作之后,球的数量都会动态变化。如果每次都选择中间的数字,这样每次操作之后,如果 \(N\) 为奇数的话,可以变成 \(2\) 个对称相同的数组, \(N\) 为偶数的话,则 \(2\) 个数组中元素值会相差 \(1\) ,再选择元素值更多的数组进行消除,这样可以实现操作次数最少

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
private static int leastTimes_power(int n) {
int ans = 1;

for (int i = 0; i <= Math.sqrt(n); i++) {
if (Math.pow(2, i) <= n) {
ans = i;
} else {
break;
}
}

return ans + 1;
}

为什么每次选取中间的数字进行操作次数最少呢?下面我们就来严谨的证明下!

阅读全文 »

By Long Luo

在科研和工程领域中,阶乘( \(\textit{Factorial}\) )有着广泛的应用。在概率论中,阶乘是计算排列( \(\textit{Permutation}\) )和组合( \(\textit{Combination}\) )时不可或缺的;在物理中,计算粒子系统的状态数以及大型系统的统计分布都要用到阶乘;在计算机中,阶乘则用于图论和组合优化问题。

大家都知道“指数爆炸”这个值,因为指数增长是非常迅猛的。其实阶乘增长要远远快于指数增长,如下图 1 所示为不同算法复杂度增长情况。随着 \(n\) 的增大,阶乘的计算复杂度迅速上升,当处理大 \(n\) 时,计算 \(n!\) 会变得极其复杂且耗时。例如 \(5! = 120\) ,而 \(50! \approx 3.04 \times 10^{64}\) ,这已经是一个非常庞大的数字!直接使用递归方法去求解 \(n!\) 的时间复杂度是 \(O(n)\) ,对于较大的 \(n\) 来说很容易栈溢出。在实际应用中,往往需要计算大数的阶乘,即使目前最先进的计算机去处理极大数的阶乘时,也会面临需要巨大的计算及存储资源消耗问题。

图1. 不同算法时间复杂度 Time Complexity Comparison

人们迫切需要找到一种可以快速计算阶乘的方法,在 18 世纪初期,苏格兰数学家詹姆斯·斯特林( \(\textit{James Stirling}\) )提出了斯特林公式 。斯特林公式( \(\textit{Stirling's Approximation}\) )提供了一种近似计算阶乘的方法,特别适用于大 \(n\) 的情况,其标准形式为:

\[ n! \approx {\sqrt {2\pi n}} \,\left( {\frac {n}{e}} \right )^n \tag{1.1} \label{1.1} \]

其对数形式为:

\[ \ln (n!) \approx n \ln n - n \]

这个公式最早是亚伯拉罕·棣莫弗( \(\textit{Abraham de Moivre}\) )在研究二项分布时,为了解决大数阶乘问题时发现的,其形式为:

\[ n! \approx C n^{n + \frac {1}{2}}e^{-n} \tag{1.2} \label{1.2} \]

其中 \(C\) 为某个常量值,斯特林证明了公式中 \(C = \sqrt {2 \pi}\) ,于是冠名权就给了斯特林。

斯特林公式可以大大简化阶乘的计算,特别是当 \(n\) 很大时,它提供了一个非常精确的近似值。斯特林公式使得复杂的阶乘计算可以通过较为简单的幂函数、指数函数和根号运算来完成。相比于直接计算阶乘,它极大地减少了计算量,是大数问题中不可或缺的工具。

斯特林公式中集合了圆周率 \(\pi\) 和自然常数 \(e\) ,这 \(2\) 个数学中最重要的常数,十分独特且具有美感。因为 \(e\) 意味着连续增长,而阶乘就是连续自然数的相乘。而出现 \(\pi\) 的时候,就要问自己 “Where is the circle?”,那么阶乘是如何和几何中的圆扯上关系了呢?

关于斯特林公式的证明,常见的证明是对数形式的证明或者利用伽马函数( \(\textit{Gamma Function}\) )来证明,这里将介绍一种从零开始更易理解的推导方式。

阅读全文 »

By Long Luo

知乎上有个问题是高考数学最后一题可以有多难? 1,而公认史上最难高考数学题就是 2008 年江西高考理科数学压轴题。2005 - 2014 年是江西自主命题,而江西卷也以题难计算量大著称,尤其是数学和理综。陶平生老师 是 2008 - 2011 年江西高考数学命题组长,参与了 2005 - 2011 年江西高考命题,他出江西数学卷时,是江西30多万学生被支配的恐惧!

作为一名来自十八线农村做题家,高考时赶上了江西自主命题,在考场上也体会到了数学和理综卷题目居然没做完没思路的恐惧!中学时没能感受到数学的乐趣,最近几年看了一些数学书之后,重新拾起了数学的乐趣,经常找些数学题来训练下我的思维,今天就来挑战一下 2010 年江西高考理科数学压轴题:

  1. (本小题满分14分) 证明以下命题:
  1. 对任意正整数 \(a\) ,都存在正整数 \(b, c\)\(b < c\) )使得 \(a^2, b^2, c^2\) 为等差数列.
  2. 存在无穷多互不相似的三角形 \(\triangle_n\) ,其边长 \(a_n, b_n, c_n\) 为正整数且 \(a_n^2, b_n^2, c_n^2\) 成等差数列.

这道题其实是数论( \(\textit{Number theory}\) ) 2 背景,除了搞竞赛的同学,谁学过数论呢?这种构造性( \(\textit{Constructive proof}\) ) 3 题目,没有接触过类似题目的话,根本不知道如何下手。要是我在考场上也会一脸懵圈,甚至在几年前我也是一筹莫展,不过现在倒是有勇气挑战这类题目了!网上关于这道题的参考答案太简略了,主要是如何找到答案的构造不清楚。这道题真是一道绝妙的题,我花了比较长时间来思考这道题,下面详细描述我的解题思路。

第一问

根据题意,正整数 \(a, b, c\)\(b < c\) ,满足 \(a^2, b^2, c^2\) 为等差数列,即:

\[ b^2 - a^2 = c^2 - b^2 \Rightarrow 2b^2 = a^2 + c^2 \]

观察上式,我们可以得到 \(2\) 个推论:

  1. \(a < b < c\)
  2. \(a\)\(c\) 要么都是偶数,要么都是奇数。

因为 \(a\) 为任意正整数,那么就从最简单的开始,不妨设 \(a = 1\) ,则有:

  1. \(c = 1\) , 得 \(b = 1\) ,与 \(a < b < c\) 矛盾;
  2. \(c = 3\) , 得 \(b = \sqrt {5}\) ,与 \(b\) 为正整数矛盾;
  3. \(c = 5\) , 得 \(b = \sqrt {13}\) ,与 \(b\) 为正整数矛盾;
  4. \(c = 7\) , 得 \(b = 5\) ,满足条件。

简单猜测实验得到一组要求的值: \(a = 1\) , \(b = 5\) , \(c = 7\)

再设 \(a = 2\) ,同理有:

  1. \(c = 4\) , 得 \(b = \sqrt {10}\) ,与 \(b\) 为正整数矛盾;
  2. \(c = 6\) , 得 \(b = 2 \sqrt {5}\) ,与 \(b\) 为正整数矛盾;
  3. \(c = 8\) , 得 \(b = \sqrt {34}\) ,与 \(b\) 为正整数矛盾;
  4. \(c = 10\) , 得 \(b = 2 \sqrt {13}\) ,与 \(b\) 为正整数矛盾;
  5. \(c = 12\) , 得 \(b = \sqrt {74}\) ,与 \(b\) 为正整数矛盾;
  6. \(c = 14\) , 得 \(b = 10\) ,满足条件。

通过实验又得到一组要求的值: \(a = 2\) , \(b = 10\) , \(c = 14\)

综合 \(a\) 为奇数和偶数的情况,猜想:

对于 \(\forall a = n \in \mathbb{N}^+\) ,令 \(b = 5a\) , \(c = 7a\) ,易得:

\[ 2 \cdot (5n)^2 = n^2 + (7n)^2 \]

故命题(1)得证。

阅读全文 »
0%