Antiprime解题报告
2005-12-13 17:18
344 查看
Antiprime解题报告
题目简述:
设n是一个自然数,如果所有小于n的自然数的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1, 2, 4, 6, 12, 24。
给定一个自然数n(1 <= n <= 2 000 000 00),计算不大于n的最大Antiprime数。基本思想:
定理 设p = 2^t1 * 3^t2 * …… * p^tk(其中p是第k大的质数)是Antiprime数,则必有:t1 >= t2 >= t3 >= … >= tk >= 0。
证明 若不然可将{ti}由大到小排序,设形成的新有序序列是{ti’},t1' >= t2' >= t3' >= … >= tk';令p’ = 2^t1' * 3^t2' * …… * p^tk',则:p' < p,但p'的约数个数却不少于p(实际上两者约数个数相等),这与p是Antiprime数矛盾。所以必有:t1 >= t2 >= t3 >= … >= tk。
实现方法:
程序的核心是使用递归函数solve()获取所有符合上述定理得t序列。由multiply()求每一个序列对应的p值,再由count()求p值的因数的个数。在此过程中记录因数个数最多而本身数值最小的数即为antiprime数。
优化策略:
由于采用构造性的解法,题目的规模并不大,递归可以简洁而有效的解决问题。Profiling的结果也证明了这一点。低效的count()占用了100%的开销!改进的方法是使用已经求得t序列可以组合计算因数的个数,实现比较复杂。但我目前想不到比较简单的实现方式。目前的效率也可以接受,最大边界情况下我的600MHzCPU需要1.2s左右,所以就没有继续改进。
源代码:antiprime.tar.bz2 antiprime.c
附录:antiprime数搜索结果:
1,
2,
4,
6,
12,
24,
36,
48,
60,
120,
180,
240,
360,
720,
840,
1260,
1680,
2520,
5040,
7560,
10080,
15120,
20160,
25200,
27720,
45360,
50400,
55440,
83160,
110880,
166320,
221760,
277200,
332640,
498960,
554400,
665280,
720720,
1081080,
1441440,
2162160,
2882880,
3603600,
4324320,
6486480,
7207200,
8648640,
10810800,
14414400,
17297280,
21621600,
32432400,
36756720,
43243200,
61261200,
73513440,
110270160,
122522400,
147026880,
183783600,
245044800,
294053760,
367567200,
551350800,
698377680,
735134400,
1102701600,
1396755360
相关文章推荐
- Antiprime解题报告
- poj 2739 Sum of Consecutive Prime Numbers 解题报告
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
- POJ - 3126 Prime Path解题报告
- 解题报告_sum of consecutive prime numbers
- HDOJ-2136-Largest prime factor 解题报告
- POJ-3126 Prime Path 解题报告
- 【原】 POJ 2739 Sum of Consecutive Prime Numbers 筛素数+积累数组 解题报告
- BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
- USACO Section 1.5 Prime Palindromes 解题报告
- HDU 4135 Co-prime 解题报告(因式分解 + 容斥原理)
- 解题报告 之 HOJ2276 SOJ2498 Count prime
- [Leetcode] 786. K-th Smallest Prime Fraction 解题报告
- POJ 3292 Semi-prime H-numbers 解题报告(筛选)
- LA-3883 & POJ-3518 Prime Gap 解题报告
- POJ_3126Prime Path解题报告
- UVA 12542 Prime Substring 解题报告
- Prime Path(POJ 3126)解题报告
- Uva 10780 Again Prime? No time. 解题报告(数学)
- POJ 3518 Prime Gap 解题报告