反质数特性及其求解方法探讨.pdfVIP

  • 1
  • 0
  • 约1.96千字
  • 约 2页
  • 2026-02-02 发布于北京
  • 举报

AntiPrimeSolution

【题意描述】

首先定义一个函数f(x),f(x)表示x的约数的个数。题目中要求的最大

的一个数m满足下列条件:m≤n,且对于一切i<m,有f(i)<f(m)。

【分析】

由于拿到题目时,不知道如何着手。我们首先试着来从小的数据里总结一些

规律出来。

为了能更快的求出一个数的约数,我们来分析一下如何构造函数f(x)。令

x=p1x1*p2x2*……*pnxn(p1,p2……pn均为质数),则f(x)(x1+1)*

(x2+1)*……*(xn+1)。

直接构造出一个反质数比较,我们先给出一个可能是反质数的值A,然

后是否能举出反例,即小于A的数B有的约数。再这样的句反例的过程中

2

我们来看看反质数又怎样的性质。比如先给出一个数50,50=2*5,f(50)

=(1+1)*(2+1)=6。我们找到了一个反例:18=2*32,f(18)=6,而18

小于50,故50不是反质数。在这里我们得到一个结论:

性质一:令Ap1x1*p2x2*……*pnxn(p1,p2……pn均为质数)。

若A是反质数,那么p1,p2……pn是相邻的质数,且p1=2。

这点很容易证明,若pi,pi+1不是相邻的质数或p12,则存在质数p,

满足ppn,且p不是A的质因子。这时我们可将pn换成p,A变小了,但所

含有的约数个数却没变。这与A是反质数。

2

那么18是不是反质数呢?我们又找到了一个反例:12=2*3,f(12)=6。

而12小于18,故18也不是反质数。我们又得到了一个性质:

性质二:令Ap1x1*p2x2*……*pnxn(p1,p2……pn均为质数)。

若A是反质数,那么x1≥x2≥……≥xn。

同样的,我们用反证法来证明,若xixj(ij),我们可将xi与xj互换,A

变小了,但所含的约数个数没变,与A是反质数。

有了以上的两条结论我们可以知道反质数的质因子只能是由2开始的连续

9

的质数,而且质因子上的指数递减。题目中规定反质数的上界为2*10,而

9

2*3*5*7*11*13*17*19*23*296*10,故我们只用考虑从2到29内的

质数即可。这样,我只要通过搜索,枚举2到29中质数上的因子就可以得到最

大的反质数了。

【算法设计】

1.读入N;

2.枚举10个小质数的个数x,满足x1=x2=x3=…=x10,若乘

积大于N,则剪枝,否则和当前比大小,取大的数;

3.输出。

【算法效率】

本题的时间复杂度很难估计,应该来说这是一个NP的问题,但由于满足反

质数条件的数相当少,而且在程序中能加入很强的截枝条件。这使得程序的效率

很高:对于所有的测试数据,程序都能在瞬间出解。

【总结】

在解这道题的过程中,我们没有直接寻找Antiprimenumber的性质,而

是从计算约数个数的方法入手,发现了约数个数,只与分解质因数后的指数有关,而

与底数无关,进而得到了一个数是Antiprimenumber的必要条件。最后,通

过这些条件,充分挖掘数据的特征性质,缩小了搜索范围,达到了优化的目的。

信息学竞赛中,若出现数学性质很强的题目,一般都要求的是高效率,巧算

法。对于这些题目,如果一开始就仓促的去设计算法往往会四处碰壁,倒不如先

静下心来,举几个简单的例子,做一番分析,对问题有了大致了解后再动手解决。

文档评论(0)

1亿VIP精品文档

相关文档