P3801分解质因数
问题描述
记Pi表示正整数i的质因数集合。
已知正整数n,求满足下列条件的有序正整数对(a,b)的数目:
(1)1<=a<=b<=n
(2)t为a,b的最大公约数,Pt是Pn的子集
输入格式
一个正整数n.
输出格式
一个正整数,表示合题意的有序正整数对的数目.
样例输入 1
6
样例输出 1
20
样例输入 2
7
样例输出 2
19
数据范围
50%的数据1<=n<=2000;
100%的数据1<=n<=1000000.
此题有两种做法。
做法一:先介绍一种比较简单粗暴的。
我们考虑一个数$d$,满足$P_{d}$是$P_{n}$的子集,这样的$d$是比较容易求的,只需要求出$n$的质因数分解后用线性筛就可以处理,但是本题可以直接暴力一点预处理。
总之,我们求出了$d$,那么现在需要考虑对于每一个$d$,有多少个数对$(A,B)$满足$gcd(A,B)=d$,那么根据$gcd$的性质,有$gcd(\frac {A}{d},\frac {B}{d})=1$
那么显然我们只需要找出在$1-\frac {n}{d}$的范围中,有多少对互质的整数即可,那么显然是$\sum_{i=1}^{\frac{n}{d}} \varphi(i)$,那么$\varphi$的前缀和$S_{\varphi}$可以用线性筛处理,然后枚举$d$把$S_{\varphi}(\frac{n}{d})$累加起来就是答案。
代码:
1 |
|
做法二:
做法二比较的巧妙,我们可以认为在$P_{n}$中的质数不是质数,那么题设条件就变成了求有多少对互质的数对,那么显然是欧拉函数求解,但是由于质数是改动过的,我们记他为$\varphi’(x)$,那么因为这个函数与欧拉函数基本是一样的,那么他显然是积性函数,那么就可以用线性筛来搞。
具体来说,我们在普通的线性筛中,遇到质数时判断一下,如果这个质数在$P_{n}$中,那么$\varphi’(x)=x$,否则$\varphi’(x)=x-1$,然后合数还是通过积性函数性质来搞。
代码:
1 |
|