我的 Project Euler 记录

Project Euler(官网:Project Euler)是一个在算法竞赛圈内十分著名的数学解题网站。它的特点是:

  • 大约以每星期一题的频率在周末的不固定整点发布新问题。预计将在 2026 年内达到 1000 题的总题量。
  • 每个问题仅包含简洁的题目描述,且仅需要答题者提供一个答案(通常是一个数),而不需求对任意范围内的输入求出答案的程序。
  • 允许答题者通过任意方式得到答案,包括但不限于通过纸笔、编写任何编程语言、甚至是询问 LLM。
  • 相比算法竞赛关注的计算机编程问题,Project Euler 更偏重数学向的问题,但要得到答案,通常需要进行计算机编程。
    • 例如,几乎没有大模拟,也几乎没有纯数据结构或图论题。当然,可能存在问题需要转化到数据结构或图论模型进行解决,也存在少量反例。
    • 据说算法竞赛中的“数论函数求和”型问题的所有进阶技术都源自于一些 Project Euler 爱好者(xudyh、Min_25 等)的发扬光大。
  • Project Euler 反对将问题的解答过程或答案本身与未解决该问题的其他人分享或公开发布,理由是这会破坏他人的学习过程。

    Real learning is an active process and seeing how it is done is a long way from experiencing that epiphany of discovery. Please do not deny others what you have so richly valued yourself. —About - Project Euler

    或译为

    真正的学习是一个积极的过程,‘看到它是如何完成的’与‘体验发现的顿悟’之间还有很长的距离。请不要否认他人的你自身如此珍视的东西。

    • 很可惜!尽管有一定道理,但我并不能认同这一理念,而且这也与算法竞赛中的传统背道而驰。这种不认同也是建立本记录的动机之一。
  • 有着根据统计数据自动对问题进行难度评分的系统。该系统在 2026 年 1 月进行过一次更新,由原先的百分比制转为每 25 个问题一级的动态等级制,从此问题的难度不再是一个固定数值。
  • 存在一些隐藏的 Bonus 问题。
    • 很可惜!我目前并未解锁过任何一个 Bonus 问题。但它们的内容本身是容易在社区内获得的。
  • 有一个官方 phpBB 社区和一个非官方 Discord 社区。具体链接在官网容易找到。

所有 Project Euler 的非 Bonus 问题的描述本身都在 CC BY-NC-SA 4.0 协议(署名—非商业性使用—相同方式共享 4.0 国际版,协议摘要链接)下共享。即任何人可以共享和演绎其内容,但需要署名、且不应用于商业目的、并且必须对演绎后的内容以相同的协议进行分发。特此注明。(注:不构成具有法律意义的解释。)

前言

我的好友代码是 2272702_jEW3WH1QsOHaB5y0TPkUggAL7Pk0Ismb,欢迎添加。

本文旨在记录我在解决 Project Euler 的问题时的思路(整理后的)。由于历史原因和精力有限,显然不是每个我以诚实的方式解决的问题我都必然会给出思路。

很可惜!由于我曾经向某个 GitHub 仓库提交过 commit,PE 管理团队在 2025 年 9 月的某一天来了个“一网打尽”,把我的旧号给封了。

鉴于该项事实,我也相应地展现出对 PE 规则的一点基本的尊重:

  • 我不会在问题被 120 人解决前发布思路,并且如果你要访问思路的具体内容,我会基于博客园的密码保护功能,要求你提供密码
  • 每道题目对应的密码一般会是其要求的答案的一个适当的弱化,且不会在题目本身中作为例子给出,具体的尺度由我个人把握。基本上会遵循“任何对该问题有着最低限度的非平凡思考或努力结果的人应该能够回答”的程度,当然某些情况下难以设计出这样的密码时会相应调整。
  • 新号别搞!(尽管我这个记录有点跳脸)希望 PE 管理员不要再封我了。🙏

具体的实现是,我会把每道题目对应的思路发布在一个单独的博文中,在提供密码后其可以公开访问,但不会在我的博客主页显示,并且会在本文中提供指向其的链接和密码的具体需求。

我可能会提供实现代码。由于某种原因,我倾向于用 Rust 语言实现我的 Project Euler 思路,所以该语言可能会很常见。我不保证代码在任何意义上的可复现性,包括但不限于可编译、不会 panic、不会陷入死循环或超长等待、不会给出错误的答案等。

记录

我会在这里列出我公开的思路记录,按照题目编号的顺序排序。读者也可以参考下面的自动生成的目录。

#975. A Winding Path

题意简述(翻译)

对任意互素正奇数对 \((a, b)\),定义区间 \([0, 1]\) 上的函数 \(H_{a, b}(x)\)

\[H_{a, b}(x) = \frac{1}{2} - \frac{1}{2 (a + b)} \Bigl( b \cos(a \pi x) + a \cos(b \pi x) \Bigr) \]

不难得出 \(H_{a, b}(0) = 0\)\(H_{a, b}(1) = 1\) 且对任意 \(x \in (0, 1)\)\(H_{a, b}(x) \in (0, 1)\)

对任意两对满足条件的数对 \((a, b)\)\((c, d)\),在三维单位立方体 \([0, 1]^3\) 中将全体满足 \(z = H_{a, b}(x) = H_{c, d}(y)\) 的点 \((x, y, z)\) 描出来。可以证明原点 \((0, 0, 0)\) 与其对角 \((1, 1, 1)\) 是连通的。进一步地,如果假设 \(\gcd(a + b, c + d) \in \{2, 4\}\),则可以证明 \((0, 0, 0)\)\((1, 1, 1)\) 之间的不自交路径恰有一条。

上图即展示了两个例子,其中在立方体中的路径被投影到 \(x y\) 平面上,而 \(z\) 分量体现为颜色。注意右图中存在一些灰色的路径,表示其上的点虽满足条件,但不属于从 \((0, 0, 0)\)\((1, 1, 1)\) 的路径的一部分。

定义 \(F(a, b, c, d)\) 为从 \((0, 0, 0)\)\((1, 1, 1)\) 的路径中“高度变化”的总量,其中高度指的是 \(z\) 分量坐标,而高度变化指的是在“上坡”和“下坡”的路段中高度改变量的绝对值。在第一个例子中,上坡路段共有 \(11\) 段,其中升高了 \(\approx 4.00886\),下坡路段共有 \(10\) 段,其中降低了 \(\approx 3.00886\),故 \(F(3, 5, 3, 7) \approx 7.01772\)。我们给出 \(F(7, 17, 9, 19)\) 的值 \(\approx 26.79578\)

对正整数 \(3 \le m < n\),定义 \(G(m, n)\) 为全体满足 \(m \le p < q \le n\) 的素数对 \((p, q)\)\(F(p, q, p, 2 q - p)\) 之和。我们给出 \(G(3, 20)\) 的值 \(\approx 463.80866\)

\(G(500, 1000)\),四舍五入到小数点后第 \(5\) 位。

思路:博文链接(密码:\(F(1, 1, 3, 5)\) 保留 \(5\) 位小数)。

posted @ 2026-02-11 09:04  粉兔  阅读(2)  评论(0)    收藏  举报