6 solutions

  • 1
    @ 2024-12-21 16:28:00
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e8+10;
    bool st[N],idx;
    vector<int> p;
    /*
    1.标记的过程
    如果i不是[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
    153
    Accepted
    22
    Uploaded By