经过长时间思考并解决调问题的感觉太好了 ——xls
题目链接
网上的题解比较少而且都讲的比较跳跃,不知道是他们太聪明还是我太笨了。于是本着刨根问底的精神我详细推导了下过程。如果想麻烦了欢迎指正。
首先,farey 数列的分母构成的数列一定是对称的,因为如果分子与分母互质,那么分母与分子的差也一定与分母互质,这个可以用反证法证明:设分母是 m,分子是 n,如果 m 与 n 不互质,那么可以写成 m=k⋅p,n=j⋅p 那么 m−n=(k−j)⋅p 与 m 也不互质,所以 mn 与 mm−n 要么都在数列里要么都不在数列里。
其次,设当前的 order 是 k,那么当 order 增加到 k+1 时,将会有 φ(k+1) 个数被插入,这个道理很简单:如果不是互质的话就被约掉了。
下面我们看一下插入的这些数对 farey sums 有什么影响:
设 mn 插到了 ac 与 bd 之中,我看到的题解都直接给出了结论 m=a+b 这个结论看起来很神奇(事实上还有 n=c+d),但我怎么也想不出来这个是怎么得到的,于是我上了维基百科得到了思路:
首先要先证明 ac 与 bd 如果在 order 为 max(a,b) 中是相邻的两项(假设 ac 在后,写完才发现后面证明把两个弄反了,懒的改了……)那么有 ac−bd=a⋅b1 即 b⋅c−a⋅b=1,这个维基上也没给出证明,不过比较好想,依然是反证法:如果两个数之间还有其他的数 mn,那么 mn−ac<a⋅b1,bd−mn<a⋅b1,如果 a<b 我们就看前面那个不等式 mn−ac<a⋅b1,通分得 a⋅ma⋅n−c⋅m<a⋅b1,因为 a⋅n−c⋅m≥1 所以 a⋅m>a⋅b,但因为 order 为 b 所以 m 不能大于 b,与假设矛盾。a≥b 的情况与前面同理。
有了这个我们就可以轻松证明当 ac 与 bd 之间有新的数 mn 插入时那么有 a⋅n−c⋅m=d⋅m−b⋅n 移项得 n(a+b)=m(c+d),最终得到 mn=a+bc+d
明白了这关键的一步之后,原来 farey sums 中和 ba+ab(数列中对称的两项)就变成了 a+ba+ba+b+a+bb+aa+b=3+ba+ab,所以每插入两项,farey sums 就增加 3,一共插入了 φ(k+1) 项,那么 farey sums 就增加了 23⋅φ(k+1),又因为 order 从 0 变成 1 的时候只增加了 1,比 23少了21,所以最终答案应为
i=1∑n23⋅φ(i)−21
代码