Codeforces665F题解
题意:
- 让你求出满足$x \leq n$且$d(x)=\sum_{d|x}=4$的$x$的个数。
- $n \leq 10^{11}$
题解:
- $x=\prod_{i=1}^{k} p_i^{a_i},d(x)=\prod_{i=1}^{k}a_i+1$
- $d(x)=4$
- 可以得到:
- 前者非常好统计,后者如果算上完全平方数,就相当于等于两素数乘积的数的个数,设为$Ans$。
- 考虑枚举小于等于$\sqrt{n}$的素数。
- 其中$f(x)$表示小于等于$x$的素数个数。
- 然后我们听说一个叫做洲阁筛的东西。它的第一部分就是在求这个东西的。
- 于是借此机会学习了一下。
- 设$g_k(i,j)$表示$1 \cdots j$中与前$i$个质数均互质的数的$k$次方和。
- 那么在求$f(p_i)$时,可以直接线性筛得到。
- 而$f(\lfloor \frac{n}{p_i} \rfloor)=g_0(m,n)+m$
- $m$表示小于等于$\sqrt{n}$的质数个数。
- 因为$j$的取值只有$O(\sqrt{n})$种,所以暴力复杂度$O(\frac{n}{logn})$。
- 然而如果$p_i^2>j$时:
- 所以可以对于$p_{i_0}^{2}>j$时开始便不再转换。若需要$g_k(i_1,j)$的值,$i_1>=i_0$,就通过$g_k(i_1.j)=g_k(i_0,j)-\sum_{i=i_0+1}^{i_1}p_i^k$计算得到。
- 时间复杂度分析:
代码:
1 |
|