【数学思维】研究特例

1 寻找关键元素

“研究特例“,就是考察当前问题的一些特殊情形,由此发现规律,进而找到解决一般问题的途径。

一般地说,解决“特例”并不难,难的是如何将“特例”的处理方式迁移到一般问题中去。因此,对特例的处理,不仅仅是给出一个解答,而是要对“特例”进行“研究”。

如何研究?本章介绍研究特例的一种方式:寻找关键元素。

在探索解题的过程中,我们时常发现题目涉及的元素中,有些元素表现出来的特征或性质在解题中起着决定性的作用,我们把这一类元素称为关键元素。

关键元素可以是一个,也可以是多个;可以是某个确定的具体数,也可以是具有某种特征的一类元素。将关键元素迁移到一般问题中去,通过对其性质的研究,找到解题途径,是一种常用的思维方法。

1.1 寻找破坏有关性质的元素

数学解题中,我们常常要证明某些对象具有某种性质,此时,通过研究特例,发现哪些元素对相关性质具有最大的破坏力,由此找到一般问题中的关键元素,使问题迎刃而解。

例1 给定正整数\(n(n\geqslant3)\),将若干个互异的正整数排在一个圆周上,使任何相邻两数之积小于\(n\),问圆周上最多有多少个数。

分析与解 设圆周上任何相邻两数之积小于\(n\)时,圆周上数的个数最大值为\(f(n)\)

为研究此问题,我们可以依题意写一个暴力程序,方便研究\(n\)较小的情况:

#include <bits/stdc++.h>
using namespace std;
int maxCount = 0; // 记录最大能放入的数目
// 递归回溯寻找最大解
void backtrack(vector<int> &circle, int n, unordered_set<int> &used)
{
    if (circle.size() > maxCount)
        maxCount = circle.size(); // 记录最大值
    // 尝试加入新的数
    for (int x = 1; x < n; ++x)
    {
        if (used.count(x))
            continue; // 确保所有数互不相同
        if (!circle.empty() && circle.back() * x >= n)
            continue; // 检查新数x与相邻数的乘积是否符合条件
        if (!circle.empty() && circle.front() * x >= n)
            continue; // 检查新数x与开头数乘积是否符合条件
        circle.push_back(x);used.insert(x);
        backtrack(circle, n, used); // 递归继续尝试
        circle.pop_back();used.erase(x);
    }
}
int maxNumbersInCircle(int n)
{
    vector<int> circle;
    unordered_set<int> used;
    maxCount = 0;
    backtrack(circle, n, used);
    return maxCount;
}
int main()
{
    int t;
    cin >> t;
    for (int i = 1; i <= t; ++i)
        cout << i << " " << maxNumbersInCircle(i) << endl;
    return 0;
}

先取\(n\)的一些特殊值来研究。当\(n=3,4,5,6\)时,易知\(f(3)=f(4)=f(5)=f(6)=2\)

通过程序发现上述结论很容易,但如何证明\(f(n)=2(n\leqslant 6)\),且其证明方法能够迁移到一般情况才是关键。

由于\(n\)较小,最容易想到的证明方法是穷举法。

但值得指出的是:“穷举法”往往难以迁移到一般情况,除非“穷举”中包含有“大类”(即包含绝大部分元素的类)。如果“穷举”过程不包含“大类”,则须另找方法。

所以难点在于:对于简单情况不仅仅要给出一个证明,更重要的是要找到一个适应一般情况的证明。

对于本题,直接证明比较困难,可尝试反证法。

假设\(n\leqslant6\)时,圆周上至少有\(3\)个数。

这一假设含有不确定因素:圆周上数的个数究竟是多少并不确定,因而不好利用假设,为此,一般有两种处理办法:

方案\(1\):引入“容量”参数,设有\(t(t\geqslant3)\)个数;

方案\(2\):取极端,取出其中\(3\)个数\(a,b,c(a<b<c)\)

通常优先考虑方案\(2\)取极端,但对于本题,若采用“取出3个数”的方法,则其证明是不严格的:

不妨取出其中\(3\)个数\(a,b,c(a<b<c)\),则\(a\geqslant1\),进而\(b\geqslant2\)\(c\geqslant3\),于是\(bc\geqslant2\times3=6\),但\(b,c\)在圆周上相邻(\(3\)个数中任何两个都相邻),矛盾。

这里,“\(b,c\)在圆周上相邻”并非必然,因为当数的个数多于\(3\)时,\(b,c\)之间还可以插入其他数,从而它们在圆周上可能不相邻。

严格的证明是引入“容量”参数,设圆周上有\(t\)个数\((t\geqslant3)\),按逆时针方向依次为\(a_1,a_2,…,a_t\),不妨设\(a_1\)最小,则\(a_1\geqslant1\),于是\(a_2a_3\geqslant2\cdot3=6\geqslant n\),但\(a_2,a_3\)在圆周上相邻,矛盾。

显然,上述证明过程中的关键元素是\(a_2,a_3\),进一步发现,关键元素是除\(a_1\)外的其他所有元素:\(a_2,a_3,…,a_t\),因为这些元素中任何两个不能相邻。

研究完了这个小例子,我们接下来要准备面对\(n\)很大的一般情况。

如何将这些元素迁移到一般情况中去?

我们需要研究这些元素的特征,因为大多数情况下,具体数值是无法迁移的,只有“特征元素”才有可能迁移。

\(a_2,a_3,…,a_t\)具有怎样的特征?

从数值特征上看,\(a_2,a_3,…,a_t\in A=\{x\in N|x\geqslant2\}\)

从位置(关系、结构)特征上看,\(a_2,a_3,…a_t\)在圆周上两两不相邻。

于是,令\(A=\{x\in N|x\geqslant2\}\),则\(A\)中的元素都是“关键元素”。为叙述问题和进一步扩展研究的方便,我们称\(A\)中的数也就是所谓的“关键元素”为“大数”,其他的数为“小数”。

对一般情况,我们要找到相应的\(A\),使\(A\)中任何两个数在圆周上不能相邻(否则破坏题目目标所要求的性质),为此,我们要对“大数”“小数”给出一个一般性的定义。

容易看出,如果一个数为大数,则比它大的数都是大数,我们只需考查最小的大数即可得到一个合适的定义。假定\(k\)是最小的大数,则\(k,k+1\)不能相邻,即\(k(k+1)\geqslant n\),由此可得到大数的定义。

定义 如果\(k(k+1)\geqslant n\),则称\(k\)为“大数”,否则称为“小数”。

找到了关键元素,则容易得到相关的范围估计。

实际上,设圆周上共有\(s\)个小数,\(t\)个大数,则因为大数不能相邻,圆周上的\(t\)个大数形成了\(t\)个“空”(相邻两个大数之间的位置),每个空中至少有一个小数,即\(t\)个大数至少需要\(s\)个小数来防止相邻,所以\(t\leqslant s\)

因此圆周上数的个数\(f(n)=s+t\leqslant 2s\),我们就得到了\(f(n)\)的一个表达式和一个范围估计。

对于一个给定的\(n\),哪些数是大数?哪些数是小数?

显然,

posted @ 2025-05-20 18:00  这很调和  阅读(71)  评论(0)    收藏  举报