题目链接:https://www.luogu.com.cn/problem/P1014

有理数可枚举

In 1873 Cantor proved the rational numbers countable, i.e. they may be placed in one-one correspondence with the natural numbers.

来自:Georg Ferdinand Ludwig Philipp Cantor

1873 年,Cantor 证明了有理数是可枚举的。可枚举指的是,你可以为集合中的每个元素都分配一个唯一的自然数,建立一个一一对应的关系。

有理数具有 \(p/q\) 的形式。\(p\) 表示分母,\(q\) 表示分子,其中 \(p\) 和 \(q\) 均为正整数。

我们可以将所有有理数排列在一个表格中,其中 \(p\) 表示行,\(q\) 表示列,

\[\begin{array}
{c|cccc}
p/q&1 &2 &3 &\cdots\\
\hline
1 &1/2&1/2&1/3&\cdots\\
2 &2/1&2/2&2/3&\cdots\\
3 &3/1&3/2&3/3&\cdots\\
\vdots&\vdots&\vdots&\vdots&\ddots\\
\end{array}
\]

为了对有理数进行编号,我们需要按照某种方式,将元素排成一条线。这里我们从 \(1/1\) 出发,然后移动到 \(2/1\),再往斜上方进行移动。继续按照这种方式,即,我们按照 \(\mathrm{Z}\) 型线路对沿路的元素进行编号,具体可查看下图,

图片来自:How can the set of the rational numbers be countable if there is no

通过上面的方式,我们为每个有理数都指定了一个编号,下表列出了一部分有理数和其编号,

\[\begin{array}
{c|ccc}
N &1 &2 &3 &4 &\cdots\\
\hline
R&1/1 &1/2 & 2/1 &3/1&\cdots\\
\end{array}
\]

通过编号 \(N\) 获取有理数 \(R\)

哪一条对角线?

题目中我们需要通过给定的编号 \(N\),来获取对应的有理数 \(R\)。

为了获取有理数 \(R\),我们首先需要知道 \(R\) 位于第几条对角线。通过观察图片,我们发现第一条对角线上的元素个数是 \(1\),第二条对角线上的元素个数是 \(2\),按照这种方式,我们可以得知第 \(n\) 条对角线上面的元素个数是 \(n\)。我们由此可以得知前 \(n\) 条对角线的元素个数总和为 \(1+2+\cdots+n\),根据求和公式我们可得,

\[1+2+\cdots+n=\sum_{i=1}^{n} i=\dfrac{n(n+1)}{2}
\]

假设编号 \(N\) 在 \(n\) 条对角线上,那么 \(N\) 满足以下的不等式

\[\begin{gather*}
\dfrac{n(n-1)}{2} < N \leqslant \dfrac{n(n+1)}{2} \\
n^2 - n < 2N \leqslant n^2+n \\
\\\hline\\
2N \leqslant n^2 + n \\
0 \leqslant n^2 + n - 2N \\
\dfrac{-1+\sqrt{1+8N}}{2} \leqslant n \\
\\\hline\\
n^2 - n < 2N \\
n^2 - n - 2N < 0 \\
n < \dfrac{1+\sqrt{1+8N}}{2} \\
\\\hline\\
\dfrac{-1+\sqrt{1+8N}}{2} \leqslant n < \dfrac{1+\sqrt{1+8N}}{2} \\
n \in \left[\dfrac{-1+\sqrt{1+8N}}{2}, \dfrac{1+\sqrt{1+8N}}{2}\right)

\end{gather*}
\]

我们注意到 \(\left[\dfrac{-1+\sqrt{1+8N}}{2}, \dfrac{1+\sqrt{1+8N}}{2}\right)\) 的区间长度为 1。这时候,我们考虑两种情况:

  1. 左端点为整数。右端点此时也为整数,所以我们可知 \(n\) 的值必为左端点,即 \(n = \left\lceil\dfrac{-1+\sqrt{1+8N}}{2}\right\rceil\)。如果为右端点减去一个极小值 \(\epsilon\),再对其向下取整,我们可以得到,\(n = \left\lfloor\dfrac{1+\sqrt{1+8N}}{2}-\epsilon\right\rfloor\);
  2. 左端点为小数。我们可以很容易就知道 \(n = \left\lceil\dfrac{-1+\sqrt{1+8N}}{2}\right\rceil\), 右端点此时也为小数,如果为右端点减去一个极小值 \(\epsilon\)(小于左端点和左端点向下取整的差值),再对其向下取整,我们可以得到,\(n = \left\lfloor\dfrac{1+\sqrt{1+8N}}{2}-\epsilon\right\rfloor\);

现在,我们已经得到了两个公式。通过任一公式,我们都可以知道元素位于第几条对角线。

对角线上第几个元素?

下一步,我们需要知道这个元素是对角线上的第几个元素。我们已经知道这个元素位于第 \(n\) 条对角线,那么只要将编号 \(N\) 减去前 \(n-1\) 对角线包含的元素个数,就可以得出元素在对角线 \(n\) 上的位置 \(k\)。结合求和公式,我们得到,

\[\begin{gather*}
k = N - \sum_{i=1}^{n-1} i \\
k = N - \dfrac{n(n-1)}{2}
\end{gather*}
\]

分母和分子

图片来自:How can the set of the rational numbers be countable if there is no

我们按照 \(\mathrm{Z}\) 型线路对沿路的元素进行编号,奇数对角线我们按照 \(\nearrow\) 的方向进行编号,偶数对角线我们则以 \(\swarrow\) 方向进行编号。

通过观察,我们发现同一对角线上的分母和分子之和 \(p+q\) 等于对角线编号 \(n+1\)。如果对角线方向为 \(\nearrow\),

则对角线上的第一个元素的分子为 \(1\),对角线上的第 \(k\) 个元素的分子为 \(k\);如果对角线方向为 \(\swarrow\),则对角线上的第一个元素的分母为 \(1\),对角线上的第 \(k\) 个元素的分母为 \(k\)。从而我们可以得到如下的公式,

\[p = \begin{cases}
(n+1)-k, & n \text{ 是奇数}\\
k , & n \text{ 是偶数}\\
\end{cases}
\]
\[q = \begin{cases}
(n+1)-k, & n \text{ 是偶数}\\
k , & n \text{ 是奇数}\\
\end{cases}
\]

代码

通过上面的公式,我们得到最终的代码,

// https://www.luogu.com.cn/problem/P1014

#include <iostream>
#include <cmath> int main()
{
int N, n, k, p, q; std::cin >> N; n = ceil((sqrt(1+8*N)-1)/2); /* Another way to calculate the diagonal number `n' */
// const double epsilon = 1e-9;
// n = floor((sqrt(1+8*N)+1)/2-epsilon); k = N-n*(n-1)/2; if (n&1)
{
p = (n+1) - k;
q = k;
}
else
{
p = k;
q = (n+1) - k;
} std::cout << p << '/' << q << std::endl;
return 0;
}

P1014 [NOIP1999 普及组] Cantor 表的更多相关文章

  1. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截

    先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...

  2. [NOIP1999] 普及组

    回文数 /*By SilverN*/ #include<algorithm> #include<iostream> #include<cstring> #inclu ...

  3. P1015 [NOIP1999 普及组] 回文数

    点击查看题目 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 ...

  4. 洛谷 P1020 [NOIP1999 普及组] 导弹拦截

    Coidng #include <iostream> #include <algorithm> #include <cstring> #include <ve ...

  5. Cantor表(NOIP1999)

    题目链接:Cantor表 这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚. 给张图: 看到这,你应该明白题目意思了. 先看看有什么规律. 我把这个数列写出来: 1/1,1/2,2/1,3/ ...

  6. 洛谷——P1014 Cantor表

    P1014 Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 ...

  7. 洛谷P1014 Cantor表

    P1014 Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 ...

  8. 洛谷 P1014 Cantor表

    P1014 Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 ...

  9. NOI / 2.1基本算法之枚举-8760:Cantor表

    总时间限制: 1000ms 内存限制: 65536kB 描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编 ...

  10. 14. Cantor表

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数 ...

随机推荐

  1. linux 部署轻量级堡垒机Next Terminal

    对比 类似的开源堡垒机有 Teleport,Jumpserver,Next Terminal等等. Teleport 安全性最好,较轻量,但是对被管理资产不透明,纳管前需要双向认证,在资产设备上需额外 ...

  2. 如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3)

    如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3) superrace• 18-06-12 作者简介:史梦晨,曾就职于国内金牌集成商, 现就职于EANTC( 欧洲高级网络 ...

  3. python之自动化连连看脚本-第二关下移-小记

    (如想转载,请联系博主或贴上本博地址) 参考前一篇基础上,做出第二关下移逻辑判断,写的比较啰嗦. 下移和第一关不动基础代码是一样的.需要注意同列下移和不同列下移2种情况,同列下移需要注意相邻的2个和不 ...

  4. webpack之性能优化(webpack4)

    在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...

  5. laravel whereHas sum & addSelect sum

    $users = User::select('id', 'username', 'coins', 'cut') ->when(request()->has('agent_tip_sum') ...

  6. 在CentOS中安装和使用nginx

    概述 本文简单讲述一下,如何快速将一个内网的Web服务通过nginx提供给外网访问,并且启用HTTPS.例如我们部署了一个kubesphere,地址为192.168.202.151:30880,需要通 ...

  7. 非侵入式入侵 —— Web缓存污染与请求走私

    作者:vivo 互联网安全团队- Gui Mingcheng 本文介绍了两种攻击者无需直接接触服务端即可攻击和影响用户行为的安全漏洞 -- Web缓存污染与请求走私.Web缓存污染旨在通过攻击者向缓存 ...

  8. docker mysql8.0 启动,挂数据卷,定时备份,恢复~

    安装mysql 从mysql社区版的官方源去拉取镜像:mysql/mysql-server - Docker Image | Docker Hub docker run --name=mysql1 - ...

  9. 音频的价值、AI Codec 的意义与算法能力的边界丨一期一会 • 音频工程师专场

    前言 音频技术发展到今天,经历了从模拟音频到数字音频到历程.国际音频工程师协会创建于 1948 年,中国数字音频技术起步相对较晚,长期被国外组织和公司垄断.随着中国的不断发展.科技日益进步,经过近三十 ...

  10. Dash 2.9.0版本重磅新功能一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,就在昨晚,Dash框架发布了其2.9.0版本更新,在一众更新 ...