无平方因子的数

418 阅读1分钟

无平方因子的数

给出正整数n和m,计算区间[n,m]内的"无平方因子"的数有多少个?整数p无平方因子,当且仅当不存在k>1,使得p是k^2的倍数。 (1<n≤m≤10^12 ,m-n≤10^7)

【分析】

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;
}