思路
我们只要求出每个数的最大质因数,再一个个判断是否满足要求即可。
如何找到每个数的最大质因数呢?其实,我们可以在埃氏筛法的基础上进行改进,从而达到算出最大质因数的目的。
让我们先来了解一下埃氏筛法,知道的人可以跳过。埃氏筛法,首先定义一个 bool
型数组(初始全部赋值为
1
1
1,再后面我们用
f
l
a
g
flag
flag 进行代替),如果
f
l
a
g
i
flag_i
flagi(
2
≤
i
≤
n
2\le i\le n
2≤i≤n,
i
i
i 初始值为
2
2
2) 为 true
,而由于
i
i
i 的倍数肯定包含质因数
i
i
i,所以就要依次将下标为
i
i
i 的倍数的位置的值都改成 false
,最后将
i
i
i 的值加上
1
1
1。通过进行如上操作后,
f
l
a
g
flag
flag 数组中值为 true
的位置的下标即为质数。具体的代码如下:
for(int i=2;i<=n;++i) if(flag[i]) for(int j=i;j<=n;j+=i) flag[j]=false;
那么,如何进行改进呢?其实,我们可以不把下标为
i
i
i 的倍数的位置的值改成 false
,而是改成
i
i
i,而
i
i
i 也就是它们当前的最大质因数,如果后面
i
i
i 加了若干个
1
1
1 之后还是它们之中任意个的质因数,则会更改其最大质因数为现在的
i
i
i。需要注意的一点是,由于埃氏筛的筛法变了,它的判断条件也将改变,并且由于
f
l
a
g
flag
flag 所存储的类型改变成了 int
类型,所以也要将
f
l
a
g
flag
flag 改成 int
类型。
code
#include<iostream>
using namespace std;
int n,b,Max[1000005]/*存储最大质因数*/,ans;
int main() {
cin>>n>>b;
Max[1]=1;
for(int i=2;i<=n;++i) if(!Max[i]) for(int j=i;j<=n;j+=i) Max[j]=i;//找到最大质因数
for(int i=1;i<=n;++i) if(Max[i]<=b) ++ans;//判断是否满足要求
cout<<ans;
return 0;
}