无平方因子的数
给出正整数n和m,计算区间[n,m]内的"无平方因子"的数有多少个?整数p无平方因子,当且仅当不存在k>1,使得p是k2的倍数。
(1<n≤m≤1012 ,m-n≤107)
【分析】
1.直接枚举肯定超时。
另一种办法和Eratosthenes筛法思路差不多
1.筛法求出所有素数。
2.对于不超过√m的所有素数p,筛掉区间[n, m]内p^2的所有倍数。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
vector<int> shu(n+1,1);
vector<int> shudata;
for (int i=2;i<=n;i++ )
{
if(shu[i])
{ shudata.push_back(i);
for(int j=i*i;j<=n;j+=i)
{
shu[j]=0;
}
}
shu[i]=1;
}
//对于不超过根号m得所有素数p,筛掉[n,m] 的所有p^2的倍数
for (int i=0;shudata[i]<=(int)sqrt(n);i++ )
{
for(int j=shudata[i]*shudata[i];j<=n;j+=shudata[i]*shudata[i])
{
shu[j]=0;
}
}
for (int i=m;i<=n;i++ )
{
if(shu[i])
{
cout<<i<<"\n";
}
}
return 0;
}