zoukankan      html  css  js  c++  java
  • 线性素数筛(欧拉筛)(超级好的MuBan)

    Problem:找出小于等于n的所有素数的个数。

    #include <bits/stdc++.h>
    
    using namespace std;
    const int maxn = 1e6;
    
    int prime[maxn];  // 欧拉线性素数筛,O(n)
    bool vis[maxn];   // 标记
    
    int Prime(int n)  
    {
        memset(vis,false,sizeof(vis));
        int cnt = 0;                
        vis[0] = vis[1] = true;
        for(int i = 2; i <= n; i ++)
        {
            if(!vis[i])prime[cnt++] = i;         
            for(int j = 0; j < cnt && i*prime[j] <= n; j ++)
            {
                vis[i*prime[j]] = true;
                if(!(i%prime[j])) break;
            }
        }
        return cnt;
    }
    
    int main()
    {
        int n;
        cin >> n;
        int ans = 0;
        ans = Prime(n);
        cout << ans << endl;
        return 0;
    }
    

    if(i % prime[j] == 0) break;

    解释:
          首先,任何合数都能表示成多个素数的积。所以,任何的合数肯定有一个最小质因子。我们通过这个最小质因子就可以判断什么时候不用继续筛下去了。

          当i是prime[j]的整数倍时(i % prime[j] == 0),i*prime[j+1]肯定被筛过,跳出循环。

          因为i可以看做prime[j]*某个数, i*prime[j+1]就可以看做 prime[j]*某个数*prime[j+1] 。而 prime[j] 必定小于 prime[j+1],
    所以 i*prime[j+1] 必定已经被 prime[j]*某个数 筛掉,就不用再做了√

          同时我们可以发现在满足程序里的两个条件的时候,prime[j]必定是prime[j]*i的最小质因子。这个性质在某些题里可以用到。

          这样就可以在线性时间内找到素数啦~(≧▽≦)/~

    解释转自https://blog.csdn.net/tianwei0822/article/details/78309453

  • 相关阅读:
    vue实现通过链接跳转到页面
    vue-cli2-项目的创建
    平均数
    Spring-Spring简介
    vue + element-ui 表单校验封装公用方法
    Python(一)数据结构和算法的20个练习题问答
    Python包中__init__.py作用
    if __name__=="__main__":
    execute immediate
    oracle基础知识过一遍(原创)
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139546.html
Copyright © 2011-2022 走看看