pascal编程:Antiprime详细的解题报告,最好有源程序

来源:百度知道 编辑:UC知道 时间:2024/05/30 14:21:29
题目简述:

设n是一个自然数,如果所有小于n的自然数的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1, 2, 4, 6, 12, 24。
给定一个自然数n(1 <= n <= 2 000 000 00),计算不大于n的最大Antiprime数。

解题报告
基本思想
一种最容易想到的方法是枚举——即枚举所有小于n的自然数,一一判断之。然而n可达2*109,其时间复杂度可想而知,所以必须作一些优化。

细化
首先观察9720 = 23355,显然它不可能是Antiprime数。因为可以构造4320 = 25335,使得4320 < 9720,而4320的约数个数却不小于9720;故9720必不是Antiprime数。

定理 设p = 2t13t2……ptk(其中p是第k大的质数)是Antiprime数,则必有:t1 >= t2 >= t3 >= … >= tk >= 0。

证明 若不然可将{ti}由大到小排序,设形成的新有序序列是{ti’},t1’>= t2’ >= t3’ >= … >= tk’;令p’ = 2t1’3t2’……ptk’,则:p’ < p,但p’的约数个数却不小于p(实际上两者约数个数相等),这与p是Antiprime数矛盾。所以必有:t1 >= t2 >= t3 >= … >= tk。

实践证明,满足上述条件的数很少,当n取最大时也仅有1456个。所以可以把所有此类数搜索并存储下来,同时记录下每个数的约数个数;把它们从小到大排序后,再逐一判断哪些是Antiprime数,取最大值即可。

譬如n = 15,则满足条件的数是:1, 2, 4, 6, 8, 12,其约数个数分别是1, 2, 3, 4, 4, 6,所以不大于15的Antiprime数有:1, 2, 4, 6, 12,其中最大的是12。

至于时间复杂度不大好估计。如果有m个满足此类条件的数,则时间复杂度就是O(mlog2m),即排序复杂度。m随着n的增长而非常缓慢的增长。

小结
解决此题的关键是充分挖掘数据的特征性质,缩小解的可能范围,从而达到优化的目的。

由此可见拿到任何题目都不要急于动手,必须深入细致的剖析问题,方能达到事半功倍的效果。