Nugine 的个人博客关于

HDU-5750 Dertouzos

题目: Dertouzos

解法: 线性素数筛

看完题目,很容易想到在区间 [1,n)[1, n) 内遍历,数出最大真因子为 dd 的数有多少个,明显超时.

反过来想,如果一个正整数 tt 的最大真因子是 dd ,那么一定有

t=xd,  xdt = x \cdot d,\; x \le d

枚举这个 xx ,数出 xd<nx \cdot d < n 的有多少个就行了.

虽然把遍历区间换到了 dd 上,但还是会超时.

xx 进行分析,假设 xx 是合数,那么有

x=p1a1p2a2pnanx = p_1^{a_1} \cdot p_2^{a_2} \dots p_n^{a_n}

此时

t=xp1(dp1)t = \frac{x}{p_1} \cdot (d\cdot p_1)dp1>dd \cdot p_1 > d

ddtt 的最大真因子矛盾,所以 xx 是素数.

遍历序列长度减少,大约是 dlnd\frac{d}{\ln d}.

dd 是素数时,按上述方式遍历素数序列.

dd 是合数时

d=p1a1p2a2pnand = p_1^{a_1} \cdot p_2^{a_2} \dots p_n^{a_n}

考虑 xxpp 序列中的位置,若 xx > p1p_1,则

t=p1a1xp2a2pnant=p1(p1a11)xp2a2pnan\begin{aligned} t&=p_1^{a_1} \cdot x \cdot p_2^{a_2} \cdot \dots \cdot p_n^{a_n}\\ t&=p_1\cdot(p_1^{a_1-1})\cdot x \cdot p_2^{a_2} \cdot \dots \cdot p_n^{a_n} \end{aligned}tp1>d\frac{t}{p_1}>d

所以 dd 不是 tt 的最大真因子,构造错误.

所以 xp1x \le p_1.

因此需要遍历的素数到 d 的最小质因子为止.

整理一下,我们需要遍历素数序列 PP ,使用 PiP_idd 乘出一个正整数 tt ,如果 t<nt < n,它就符合要求,遍历到 dd 的最小质因子 p1p_1 为止.

答案就是这个有序集合的基数

{Pid  Pid<n,  Pip1,  i=1,2,}| \{ P_i \cdot d\;|P_i \cdot d < n,\;P_i \le p_1,\;i=1,2,\dots \} |

用线性素数筛预先计算出足够的素数,对每组数据分别求答案即可.

本题数据范围 10910^9.

d>109d > \sqrt{10^9},则当 xx 接近 109\sqrt{10^9} 时, xd>nx \cdot d > n 一定成立.

d<109d < \sqrt{10^9},则 dd 的最小质因子一定小于 109\sqrt{10^9}.

因此需要计算的最大素数只要大于 109\sqrt{10^9} 即可,大约 3200032000.

代码:dertouzos.cpp

发布于 2019-02-01地址: GitHub