无平方因子的数
给出正整数
n
n
和
m
m
,区间
[n,m]
[
n
,
m
]
内的“无平方因子”的数有多少个?
整数
p
p
无平方因子,当且仅当不存在
k>1
k
>
1
,使得 p 是
k2
k
2
的倍数。(1 <= n <= m <=
1012
10
12
,m - n <=
107
10
7
)。
分析:
首先先介绍一下用Eratosthenes筛法构造1 ~ n的素数表。
思想:
对于不超过 n 的每个非负整数 p,删除2p,3p,4p,…..,当处理完所有的数之后,还没有被删除的数就是素数。
实现代码:
int m = sqrt(n + 0.5);
memset(vis,0,sizeof(vis));
for(int i = 2; i <= m; i++) if(!vis[i])
for(int j = i*i; j <= n; j+=i) vis[j] = true;
这里给出一个有意思的问题:
给定n,c的值是多少???换句话说,不超过n的整数中,有多少的素数呢?
素数定理: π π ( x x )~ xlnx x l n x
最后,我们如何求出区间内无平方因子的个数呢?方法和筛素数类似,对于不超过 m−−√ m 的所有素数p,筛掉区间[n,m]内 p2 p 2 的所有倍数。
实现代码:
int r = sqrt(m + 0.5);
memset(vis,0,sizeof(vis));
for(int i = n; i <= r; i++) if(!vis[i])
for(int j = i*i; j <= m; j+=i*i) vis[j] = true;