zoukankan      html  css  js  c++  java
  • 素数筛法

    关于埃氏和其他算法

    欧拉算法

    int Prime(int N) {
        for(i=2; i<=N; i++) {
            if(!check[i])
                prime[cnt++]=i;
            for(j=0; j<cnt && prime[j]*i<=N; j++) { 
                check[prime[j]*i]=1;
                if(i%prime[j]==0)break;
            }
        }
    }

     每次遇到未标记的素数就记录,然后用当前的素数或合数与记录下的素数表依次相乘。

    蓝色的这一句,保证了每个合数只被筛去一次(如下表),也是欧拉筛法优化的核心思想。

     例如12 = 4*3 = 6*2,

    将它拆分成 (2*2)*3 和 (2*3)*2,

    因为素数之积显然不是素数,所以在继续筛的过程中一定会遇到2*3,

    说明4=2*2所筛掉的合数2*2*prime[i](除了prime[0]=2本身),一定会在以后重复算一次。

    那么先保留2的一列,3只要遇到2的倍数一定可以在2的一列出现,5只要遇到2、3的倍数一定可以在前两列出现...

    更新于19/2/11

    在浙江集训刚好学了这个qwq其实这个线性筛素数是这样的,

    因为当前枚举的合数是i*pj,且pj|i(即i%pj=0),那么下一个枚举的是i*pj+1,

    因为i已经是pj的倍数了,那么i*任何正整数一定也是pj的倍数,

    说明i*pj+1在后面一定会被更小的素数(pj)筛去。

  • 相关阅读:
    git代码提交
    bootstrap的用法、bootstrap图标
    HTML 5 Web 存储(客户端存储数据)
    require.js
    WebStrom的使用技巧
    event事件
    $().each 和 $each( )的区别
    js基础字符串
    if return的用法 逻辑运算 switch for break等用法
    date-id自定义属性
  • 原文地址:https://www.cnblogs.com/mogeko/p/10134838.html
Copyright © 2011-2022 走看看