7 solutions

  • 1
    @ 2025-11-3 17:00:11
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e8+10;
    bool st[N],idx;
    vector<int> p;
    /*
    标记过程:
    如果i不是怕p[j]的倍数,那么p[j]是小于等于i的,相等于i*p[j]是被p[j]标记的,p[j]
    是i*p[j]的最小质因数
    如果i是p[j]的倍数,那么p[j]是i的最小质因子,同时也是i*p[j]的最小质因子
    综上:每个数一定是被最小的质因子标记的
    */
    void get(int n)
    {
       for(int i=2;i<=n;i++)   //枚举所有的数
       {
          if(!st[i])
          {
             p.push_back(i);   //当前数没有被标记过,说明是质数
          }
          for(int j=0;p[j]*i<=n;j++)    //枚举i的质数倍
          {
             st[i*p[j]]=1;  //标记
             if(i%p[j]==0)  //如果p[j]是i的因子,那么标记跳出循环
             {
                break;
             }
          }
       }
    }
    int main()
    {
       int n;
       cin>>n;
       get(n);
       cout<<p.size();
       return 0;
    }

Information

ID
181
Time
2000ms
Memory
256MiB
Difficulty
5
Tags
(None)
# Submissions
172
Accepted
28
Uploaded By