zoukankan      html  css  js  c++  java
  • 整理各种线性筛法

    基本都是看jzp线性筛的...这些筛法都是O(n)的...比O(nloglogn)的算法优化了很多...

    主要思路都是对于每一个合数n,都由n的最小素因子唯一进行标记,避免了埃拉托斯特尼筛法的重复标记

    在处理欧拉和莫比乌斯函数的时候其实已经顺便筛了素数了...积性函数的性质是厉害...

    int cnt;
    int
    prime[MAXN]; int pri[MAXN]; int phi[MAXN]; int miu[MAXN]; /* 素数筛 */ void pre_prime(){ mem(prime,0); cnt = 0;
    prime[0] = prime[1] = 1;
    for(int i = 2 ; i < MAXN ; i++){ if(!prime[i]) pri[cnt++] = i; for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ prime[i * pri[j]] = 1; if(i % pri[j] == 0) break; } } } /* 莫比乌斯筛 */ void pre_miu(){ mem(prime,0); cnt = 0; miu[1] = 1; for(int i = 2 ; i < MAXN ; i++){ if(!prime[i]){ miu[i] = -1; pri[cnt++] = i; } for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ prime[i * pri[j]] = 1; if(i % pri[j] == 0){ miu[i * pri[j]] = 0; break; }else miu[i * pri[j]] = -miu[i]; } } } /* 欧拉筛 */ void pre_phi(){ mem(prime,0); cnt = 0; phi[1] = 1; for(int i = 2 ; i < MAXN ; i++){ if(!prime[i]){ miu[i] = -1; pri[cnt++] = i; } for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ prime[i * pri[j]] = 1; if(i % pri[j] == 0){ phi[i * pri[j]] = phi[i] * pri[j]; break; }else phi[i * pri[j]] = phi[i] * (pri[j] - 1); } } }
  • 相关阅读:
    想你了
    新华都总裁兼CEO唐骏演讲
    中国99%的白领以及他们的家庭即将面临破产
    你的英语水平就可以达到跟美国人交流的水平啦
    经验语录
    荒谬的加息传言
    人生格言
    不要为油荒找借口
    房地产调控失利 三次调控势不可免
    假设你的月收入2000元,你应该这样用
  • 原文地址:https://www.cnblogs.com/Felix-F/p/3353649.html
Copyright © 2011-2022 走看看