Chapter 1 整数
1.1 数和序列
数
良序性质(The Well-Ordering Property):每个非空的正整数集合都有一个最小元。
定义 如果存在整数 和 ,使得 ,则称实数 是有理数;如果 不是有理数,则称为无理数。
一些记号:整数集合、正整数集合、有理数集合和实数集合通常被记为 、、 和 。
定理 1.1
是无理数。
证明:假设 为有理数,那么存在正整数 使得 ,因此, 是一个非空的正整数集合,由良序性质, 有最小元,设其为 。由于 和 都是整数,所以 也是整数;另一方面,,所以它是正的;进一步,由于 ,所以它小于 且 ,但是这与 是 的最小元矛盾,因此 是无理数。
定义 数 被称为代数数,如果它是整系数多项式的根;也就是说, 是代数数,如果存在整数 使得 ;如果数 不是代数数,则称为超越数。
最大整数函数
定义 实数 的最大整数(greatest integer)记作 ,是小于或等于 的最大整数,即 是满足
的整数。同时也被称作下取整函数,记号是 。上取整函数记作 ,是大于或等于 的最小整数。
性质一:若 是整数,则对于任意实数 ,有 。
定义 实数 的分数部分(fractional part)记为 ,是 与 的差,即 。
性质一:由于 ,所以 ,从而 ,即 。
丢番图逼近
定理 1.2(鸽笼原理)
如果把 个或更多的物体放入 个盒子中,那么至少有一个盒子中有两个或更多的物体。
证明:如果 个盒子中的任意一个都没有多于一个的物体,那么所有物体的总数至多为 ,矛盾,所以 个盒子中的至少有一个有多于一个的物体。
定理 1.3(狄利克雷逼近定理)
如果 是一个实数, 是一个正整数,则存在整数 和 ,,使得 。
证明:考虑 个数 ,这 个数分布在 个区间中,由鸽巢原理,必定有两个数分布在同一个区间里,设这两个数为 和 ,且 ,。当 , 时,有:
且由于 ,所以 ,符合条件。
序列
序列 是一列数 。
定义 等比数列(geometric progression)是形如 的序列,其中初始项(initial term) 和公比(common ratio) 都是实数。
定义 等差数列(arithmetic progression)是形如 的序列,其中初始项(initial term) 和公比(common difference) 都是实数。
定义 一个集合可数(countable),如果它是有限的或者是无穷的但与正整数集合之间存在一个一一映射。如果一个集合不是可数的,则称为不可数(uncountable)。
定理 1.4
有理数集合是可数的。
证明:我们可以将所有有理数列成一个表格,具体的,设 ,那么我们可以通过对角线的方式把所有有理数连起来,并去掉那些已经列举过的有理数。如图:

1.2 和与积
和式
数 的和记作 。
以下是和式的一些性质:
等比数列求和
设 。
注意当 时,。
叠进和
形如 的和式被称为是叠进的(telescoping)。叠进和是非常容易计算的,因为我们有:
三角形数
三角形数 ,通过恒等式 我们可以得到 的一种求法:
乘积
数 的积记作 。
阶乘函数(factorial function)是数论中一个非常重要的函数。
定义 设 为正整数,则 是整数 的积,特别的,有 。采用乘积符号,我们有 。
1.3 数学归纳法
数学归纳原理(The principle of mathematical induction)是证明与整数有关的结果的一个有效工具。
定理 1.5(数学归纳原理)
一个包含整数 的正整数集合如果具有如下性质,即若其包含 ,则其也包含 ,那么这个集合一定是所有正整数的集合。
证明:设 是包含整数 的正整数集合,并且如果 包含 ,则一定包含 。假设 不是全部正整数的集合,那么设 ,即不包含在 中的正整数集合。由于 不是全部正整数的集合,所以 非空,根据良序性质, 存在一个最小元,记为 ,由于 在 中,所以 。但是 是小于 的正整数,所以它一定在 中,但是由于 在 中,那么 也一定在 中,矛盾,故 是全部正整数的集合。
定理 1.6(第二数学归纳原理)
对于包含 的正整数集合,如果它具有以下性质:对每一个正整数 ,如果它包含全体正整数 ,那么它也包含 ,那么这个集合一定是由所有正整数构成的集合。
为区别于数学归纳原理,第二数学归纳原理有时被称为强归纳,而数学归纳原理有时被称为弱归纳。
证明:设 是一个包含 的整数集合,并且对任意正整数 ,如果它包含全体正整数 ,那么它也包含 ,设 是所有使得小于等于 的正整数都在 中的正整数 集合。则 在 中,并且如果 在 中,则 在 中,根据数学归纳原理, 是全体正整数集合。由于 是 的子集,故 也是全体正整数集合。
递归定义
定义 我们说函数 是递归定义的,如果指定了 在 处的值,而且对于任意正整数 ,都提供了一个规则来根据 确定 。
1.4 斐波那契数
定义 斐波那契数列有如下递归定义:,且对 ,,此序列中的数被称为斐波那契数。
斐波那契数的一些性质:
对于 ,有 ,其中 。
证明:使用第二数学归纳原理,我们有 ,,所以定理对 成立。
归纳假设假定对满足 的所有整数 ,都有 ,由于 是 的一个解,所以 ,因此 ,所以 。
斐波那契数的增长
定理 1.7
设 是正整数,,则第 个斐波那契数 。
1.5 整除性
定义 如果 和 为整数且 ,我们说 整除 是指存在整数 使得 ,如果 整除 ,我们还称 是 的一个因子,且称 是 的倍数。
如果 整除 ,则将其记为 ,如果 不能整除 ,则记其为 。
定理 1.8
如果 是整数,且 ,,则 。
证明:因为 ,,故存在整数 和 ,使得 ,,因此 ,从而 。
定理 1.9
如果 为整数,且 ,,则 。
证明:因为 ,,故存在整数 和 ,使得 ,,因此 ,从而 。
定理 1.10(带余除法)
如果 和 是整数且 ,则存在唯一的整数 和 ,使得 且 。
证明:
存在性:考虑集合 ,由良序性质,集合 存在最小元 ,显然有 ,同时,如果 ,那么有 ,且 ,矛盾,所以 。
唯一性:假设存在两个式子 和 ,且 ,我们有:
因此,
由此可知 ,但是我们有 ,因此 ,,。
在带余除法中,我们称 为商, 为余数, 为被除数, 为除数。而且有 当且仅当 。并且 。
性质:如果 是正整数,则当 为实数时 。
证明:设 ,由带余除法,我们有整数 使得 ,其中 。我们有 ,所以有 ,由于 ,,我们有 ,所以 ,得证。
给定一个正整数 ,可以根据整数被 除的余数把它们分类。这引出了下面的定义。
定义 如果 被 除的余数为 ,则对某个整数 ,有 ,我们称 为偶数;而如果 被 除的余数为 ,则对某个整数 ,有 ,我们称 为奇数。
最大公因子
定义 不全为零的整数 的最大公因数是指能够同时整除 和 的最大整数。
和 的最大公因子记作 ,且对于正整数 ,有 ,特别的,定义 。
定义 设 均为非零整数,如果 ,则称 与 互素。
Chapter 2 整数的表示法和运算
2.1 整数的表示法
定理 2.1
令 是正整数,且 ,则每个正整数 都可以被唯一地写为如下形式:
其中 为非负整数, 为整数,,且首项系数 。
证明:
存在性:考虑连续使用带余除法。首先用 除 得到:
如果 ,则用 除 ,得到:
继续这个过程,直到:
可以发现:
唯一性:假定有两种 的展开式,即:
我们有:
若这两个展开式不同,则存在最小的整数 ,使得 。因此:
由于 ,所以
但是因为 且 ,故 ,因此 ,,矛盾,故展开式唯一。
2.2 整数的计算机运算
太简单了,略。
2.3 整数运算的复杂度
定义 是一个指定的实数集合,如果 和 为取正值的函数,且对于所有的 有定义,则如果存在正常数 使得对所有充分大的 均有 ,那么 在 上是 的。(通常我们取 为正整数集合,这时便不再另题集合 。)
定理 2.2
如果 是 的, 是正常数,则 是 的。
证明:,,。
定理 2.3
如果 是 的, 是 的,则 是 的,且 是 的。
证明:,,因此:
所以 是 的。另外:
所以 是 的。
推论 2.3.1
如果 和 是 的,则 是 的。
证明: 是 的,所以 ,故 是 的。
快速乘法运算
众所周知,两个 位整数相乘的朴素做法需要 次位运算,但是我们存在乘法的快速算法。比如 和 ,我们设
那么有 。有恒等式:
设 表示两个 位整数相乘所需的位运算次数,那么有:
定理 2.4
两个 位整数相乘可以用 次位运算实现。
定理 2.5
给定一个正数 ,存在计算两个 位整数的乘积的算法,只需要 次位运算。
定理 2.6
存在计算两个 位整数乘积的算法,该算法只需 次位运算。
定理 2.7
当 位整数 被不超过 位的整数 除时,存在使用 次位运算求商 的算法,其中 是计算两个 位整数乘法所需的位运算次数。
Chapter 3 素数和最大公因子
3.1 素数
正整数 只有一个正整数因子,任意其他的正整数都至少有两个正整数因子,因为它一定可以被 和自身整除。数论中只有两个正整数因子的整数是非常重要的,它们被称为素数。
定义 素数是大于 的正整数,并且除了 和它本身外不能被其他正整数所整除。大于 的不是素数的正整数被称为合数。
引理 3.1
每一个大于 的正整数都有一个素因子。
证明:我们使用反证法进行证明。假设存在一个大于 的正整数没有素因子,那么大于 且没有素因子的正整数构成的集合非空。由良序性质,存在最小正整数 ,由于 能被 整除且 没有素因子,所以 不是素数,于是 可以写成 ,其中 ,因为 ,所以 一定有素因子,由定理 1.8, 的任何因子也是 的任何因子,所以 存在素因子,矛盾。故原命题成立。
定理 3.1
存在无穷多个质数。
证明:假设只存在有限个质数 ,其中 是正整数,考虑构造整数 ,它的表达式为 。由引理 3.1, 至少有一个素因子,设其为 。如果 ,其中 为某个整数且 ,由于 ,因此 ,但 不能被任意素数整除,于是 不是 中的任何一个,与假设矛盾。故原命题成立。
定理 3.2
如果 是一个合数,那么 一定有一个不超过 的素因子。
证明:因为 是合数,所以可以把它写成 的形式,其中 ,若 ,则 ,矛盾。故 ,由引理 3.1, 至少有一个素因子,再由定理 1.8, 的因子也一定是 的因子,显然这个素因子小于等于 。
埃拉托色尼斯筛法:对于 以内的数,我们可以把所有小于等于 的素数提出来,将它的倍数筛掉,最后剩下的数就是素数。
定义 函数 表示不超过 的素数的个数,其中 是正实数。
定理 3.3(狄利克雷关于等差数列中素数的定理)
假设 是互素的正整数,那么等差数列 包含了无穷多的质数。
3.2 素数的分布
定理 3.4(素数定理)
注记:我们使用 来表示 ,其中 表示“渐近与”。按这种记法,素数定理可以写成 。
另外一个更好的近似是
推论 3.4.1
令 是第 个素数,其中 是正整数,那么 。
定理 3.5
对于任意的正整数 ,存在至少 个连续的正合数。
证明:考虑 个连续的正整数 。对于 来说,由于 ,所以 ,由定理 1.9,有 ,因此 为合数。
素数的猜想
由于下列猜想已经在较大范围内验证或被证明,所以 OI 中一般可以直接拿来用。
波特兰猜想/公设
对于任意给定的正整数 ,存在一个素数 ,使得 。
孪生素数猜想
存在无穷多的形如 和 的素数对。
Green-Tao 定理
对任意的正整数 ,存在一个由素数组成的长度为 的等差数列。
哥德巴赫猜想
每个大于 的正偶数可以写成两个素数的和。
n^2+1 猜想
存在无穷多个形如 的素数,其中 是正整数。
勒让德猜想
对任意的正整数 ,存在一个素数 ,使得 。
3.3 最大公因子及其性质
定理 3.6
是整数,且 ,那么 。
证明:假设 ,那么有 和 ,那么存在整数 使得 且 ,于是 ,,因此 是 的公因子,因为 是 的最大公因子,所以 ,,故 。
定义 一个分数 被称为既约分数,如果 。
推论 3.6.1
如果 为整数且 ,存在整数 ,使得 且 。
证明:令 ,,其中 ,则 ,由定理 3.6 可知 ,命题得证。
定理 3.7
令 是整数,那么 。
证明:令 是 的公因子,由定理 1.9 可知 ,所以 也是 的公因子。另一方面,如果 是 和 的公因子,由定理 1.9 可知 ,所以 也是 的公因子。因此 。
定义 如果 是整数,那么它们的线性组合具有形式 ,其中 都是整数。
定理 3.8
两个不全为零的整数 的最大公因子是 的线性组合中最小的正整数。
证明:因为当 时 和 必有一正,因此由良序性质,线性组合中存在最小的正整数,设其为 。我们有 。由带余除法,我们可以得到
由此方程和 可以得到
这就说明了 是 的线性组合,因为 ,且 是 的线性组合中最小的正整数,所以 ,由此可得 。同理可得 。于是我们证明了 是 的公因子。
对 的公因子 ,由于 且 ,那么由定理 1.9,有 ,因此 ,故 是 的最大公因数。
推论 3.8.1(Bézout 定理)
如果 和 均为整数,则有整数 使得 。
方程 被称为 Bézout 等式,对给定的整数 ,满足该等式的整数 和 被称为是 的 Bézout 系数或 Bézout 数。
推论 3.8.2
整数 和 互素当且仅当存在整数 和 使得 。
证明:
必要性:设 互素,由 Bézout 定理,存在整数 使得 。
充分性:设 ,因为 是最小的正整数,由定理 3.8,可知 ,从而 互素。
定理 3.9
如果 是正整数,那么所有 的线性组合构成的集合与所有 的倍数构成的集合相同。
证明:设 。
首先注意到由最大公因子的定义,有 且 ,由定理 1.9,。故 的线性组合都是 的倍数。
由定理 3.8 可知,存在整数 使得 ,而对于 的倍数,有 ,故所有 的倍数都是 的线性组合。命题得证。
定理 3.10
如果 是不全为零的整数,那么正整数 是 的最大公因子当且仅当
- 且 。
- 如果 是整数且 ,,那么 。
证明:
必要性:设 ,由公因子的定义,第 1 条显然成立;由定理 3.8,,再由定理 1.9 可知,,所以第 2 条也成立。
充分性:设第 1 条和第 2 条成立,由第 1 条可知 是 的公因子,进一步由第 2 条,我们知道如果 是 的公因子,那么 ,说明对整数 有 ,因此,,所以 是 的最大公因子。
定义 令 是不全为零的整数,这些整数的公因子中最大的整数就是最大公因子, 的最大公因子记作 。
引理 3.2
如果 是不全为零的整数,那么 。
证明: 的任意公因子也是 的公因子,因此也是 的公因子;同样 的公因子也是 的公因子,因为如果某整数是 的因子,它也一定是 的公因子。因此 的公因子集合和 的公因子集合相等,故命题得证。
定义 如果 ,那么我们说整数 互素,如果对于整数集中的每对整数 ,,有 ,即整数集中的任意一对整数都互素,那么我们就说这些整数两两互素。
3.4 欧几里得算法
引理 3.3
如果 和 是整数且 ,其中 是整数,那么 。
证明:定理 3.7 的另一种写法而已。
定理 3.11(欧几里得算法)
令整数 满足 ,如果连续做带余除法得到 ,且 ,那么 ,它是最后一个非零余数。
证明:由于余数组成的序列 ,所包含的项的个数不会大于 ,所以最后肯定会结束在 ,由引理 3.3,我们得到 ,因此 。
定理 3.12
令 和 ()是斐波那契数列中连续两项,那么用欧几里得算法证明 一共需要 次除法。
证明:从斐波那契的定义出发,有:
因此需要 次除法。
定理 3.13(拉梅定理)
用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制数的位数的 倍。
证明:
因此有 ,由斐波那契数的增长可知,,其中 ,因此有 ,两边取 可以得到 ,有 ,即 ,原命题得证。
推论 3.13.1
求两个正整数 , 的最大公因子需要 次位运算。
证明:由拉梅定理可知求 需要 次除法,而每次除法需要 次位运算,因此,由定理 2.3 可知一共需要 次位运算。
用线性组合的方法表示最大公因子
我们可以通过观察欧几里得算法的过程来得到最大公因子的线性组合,对于倒数第二步,我们有
我们就可以使用 和 的线性组合来表示 。
同时根据倒数第三步,我们有
代入得:
我们就可以使用 和 的线性组合来表示 。我们可以重复这个步骤,直到我们可以使用 和 的线性组合来表示 。
具体的,对于特定的 ,如果已经知道了
那么,因为
所以有
但是可以发现,这种方法需要把欧几里得算法每一步的 和 记下来,非常的不优雅。于是我们有另一种方法只要用一次欧几里得算法,称为扩展欧几里得算法。
定理 3.14
令 是正整数,那么
其中 是下面定义的递归序列的第 项:
且
其中 ,且 是欧几里得算法中每一步的商。
证明:我们将证明 ,因为 ,如果 ,就有 。
我们用第二数学归纳原理来证明 ,对于 ,有 ,因此其对于 成立,同样的,其对于 成立。
现在假设 ,对 成立,那么由欧几里得算法,我们有
由归纳假设,得:
故命题成立。
bykem 注:此处是书中给出的扩展欧几里得算法的过程,但是在 OI 中我们一般使用的是另一种方法,具体的,假设我们知道
那么由 的定义式我们有
那么我们就通过 对应的线性组合推出了 对应的线性组合。
具体的,我们有
且
那么我们就使用更简单的方法求出了 的线性组合表示。
注意到两个不全为 的整数的最大公因子的线性组合的表示方法有无穷多种,换句话说,每一对不全为 的整数有无穷多对 Bézout 系数,令 , 的线性组合 是 的一种表示方法,即 是 的 Bézout 系数,对所有的整数 , 和 同样是 的 Bézout 系数。
3.5 算术基本定理
引理 3.4
如果 是正整数,满足 且 ,则 。
证明:由于 ,存在整数 使得 ,同乘 得到 ,根据定理 1.9, 整除 ,因为这是 和 的线性组合,而它们都能被 整除,因此 。
引理 3.5
如果 ,其中 为素数,且 是正整数,则存在正整数 ,使得 。
证明:我们使用数学归纳原理来证明这个结论。 的情况是平凡的,假定结果对 成立,考虑 个整数,我们知道有 或者有 。对于前一种情况,由引理 3.4,我们有 ;对于后一种情况,由归纳假设,我们有整数 ,使得 。综上,我们存在整数 ,使得 。
定理 3.15(算术基本定理)
每个大于 的正整数都可以被唯一的写成素数的乘积,在乘积中的素因子按照非降序排列。
证明:
存在性:采用反证法。假设存在正整数不能被写成素数的乘积,由良序性质,其中存在最小的正整数 。一方面, 不能是素数,因为这样的话 就能表示成素数的乘积,即它本身;另一方面, 也不能是合数,因为这说明存在正整数 使得 ,但因为 都小于 ,所以它们都可以被写成素数的乘积,然而由于 ,我们得到 也是素数的乘积,矛盾。故每个大于 的正整数都可以被写成素数的乘积。
唯一性:依旧采用反证法。假设存在正整数 有两种不同的素数分解方式:
其中 和 为素数,且 ,。约去两个分解式中相同的素数,得到
因为左右两边都能被 整除,由引理 3.5,我们知道一定存在某个 使得 ,但由于每个 都是与 不同的素数,矛盾。因此正整数 的素因子分解是唯一的。
设 的素因子分解分别为:
那么有
定义 两个非零整数 的最小公倍数(the least common multiple)是能够被 和 整除的最小正整数。
的最小公倍数记作 或 。
对于最小公倍数,我们有
引理 3.6
如果 为实数,则 。
证明:若 ,则原式变为 ,显然成立;若 ,则原式变为 ,显然成立。故命题成立。
定理 3.16
如果 为正整数,则 。
证明:我们有
故命题成立。
引理 3.7
设 是互素的正整数,那么如果 是 的一个正因子,则存在唯一的一对 的正因子 和 的正因子 使得 。反之,如果 和 分别是 和 的正因子,则 是 的正因子。
证明:设 和 的素幂因子分解为 ,,因为 ,所以素数集合 和素数集合 没有公共元素,因此, 的素幂因子分解为
因此,如果 是 的正因子,则
其中 且 ,设 ,,则
显然 ,这就是我们需要的分解。进一步,这个分解是唯一的,因为 的分解中每个素数幂都需要出现在 或 中,而由于素数集合 和素数集合 没有公共元素,所以每个素数幂都会被唯一的分到 或 。
反之,设 和 分别为 和 的正因子,则
其中 且
其中 。那么整数
显然是
的因子。
狄利克雷定理中一种特殊情形的证明
狄利克雷定理:若 ,则等差数列 包含无穷多的素数。
我们将通过对数列 的狄利克雷定理的证明来说明这一点。
引理 3.8
如果 和 都是形如 的整数,则乘积 也是形如 的整数。
证明:设 ,那么有
因此命题得证。
定理 3.17
存在无穷多个形如 的素数,其中 为正整数。
证明:假设只存在有限个形如 的素数,不妨设为 。设
则在 的分解中至少存在一个形如 的素数,否则,因为所有素数都是 形式的,由引理 3.8, 也应该形如 ,于是产生矛盾。然而,素数 都不能整除 。 不能整除 ,因为如果 ,则 ,由引理 3.5,存在 使得 ,矛盾; 也不能整除 ,因为 蕴含了 ,矛盾。因此,存在无穷多个形如 的素数。
bykem 注:以下证明用到了一个结论:若 ,则 ,其中 是素数。此处给出一个证明。
证明:由算术基本定理可知, 存在唯一的质因子分解,设其为
其中 ,则
因为 是素数且 ,那么 肯定为 中的一个素数,设其为 ,那么由于 ,肯定有 ,证毕。
以下是 是无理数的另一个证明。
假定 是有理数,则 ,其中 ,因此 ,从而 ,由于 ,因此 ,设 ,有 ,因此 ,然而由于 ,矛盾,故 是无理数。
定理 3.18
设 是多项式 的根,其中系数 为整数,则 要么是整数,要么是无理数。
证明:假设 为有理数,则可以写为 ,其中 ,故有
乘以 ,得
由于
故 ,若 ,则 有素因子 ,因为 ,故 ,因此 ,但是 ,矛盾,故 ,,所以其一定是整数。
由定理 3.18 我们可以得到一个简单推论:
推论 3.18.1
设 为正整数,并且不是一个整数的 次幂,那么 是无理数。
证明:因为 是 的根,且其不为整数,由定理 3.18, 是无理数。
定理 3.19
如果 是实数且 ,则
证明这个命题需要用到高深的数学技巧,这里只给出一个证明,即右侧的乘积式被展开时,项 恰好只出现一次,我们将使用以下事实:
如果 是 的素幂因子分解,那么
恰只出现一次。
3.6 因子分解法和费马数
引理 3.9
如果 是一个正奇数,那么 分解为两个正整数的积和表示成两个平方数的差是一一对应的。
证明:设 是分解成两个正整数的积,那么 可以写成两个平方数的差,其中
反之,如果 可以写成两个平方数的差,比如 ,那么我们可以把 分解为 。
费马数
整数 被称为费马数,目前只发现 是素数。而 。
定理 3.20
费马数 的每个素因子都形如 。
引理 3.10
设 表示第 个费马数,那么对所有的正整数 ,我们有
证明:对于 ,我们有
假设等式对正整数 成立,即
那么有
因此归纳假设成立。
定理 3.21
设 和 为互异的非负整数,则 。
证明:假设 ,由引理 3.10,我们有
设 是 和 的公因子,则由定理 1.8 有
因此, 或 ,但是因为 和 都是奇数,所以 ,故 。
定理 3.22
一个正规 边形可用直尺(无刻度)和圆规画出来当且仅当 是一个 的非负幂次与非负个不同费马素数的乘积。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix