zoukankan      html  css  js  c++  java
  • 线性筛

    学习链接:

    https://www.cnblogs.com/Paul-Guderian/p/7723031.html

    素数的线性筛:

     1 bool not_prime[maxn];
     2 int prime[maxn];
     3 int Prime_sieve(int n)
     4 {
     5     int tot = 0;
     6     not_prime[1] = 1;
     7     for(int i = 1; i <= n; i++)
     8     {
     9         if(!not_prime[i])prime[tot++] = i;
    10         for(int j = 0; j < tot && 1LL * prime[j] * i <= n; j++)
    11         {
    12             not_prime[prime[j] * i] = 1;//每个合数x由它最小素因子prime[j]筛掉
    13             if(i % prime[j] == 0)break;//如果i % prime[j] == 0,不停止循环
    14             //那么接下来将用prime[j+1]筛去i*prime[j+1],但实际上应该用prime[i]筛去,因为i%prime[j]==0
    15         }
    16     }
    17     return tot;
    18 }

    欧拉函数的线性筛

     1 bool not_prime[maxn];
     2 int prime[maxn];
     3 int phi[maxn];
     4 void phi_sieve(int n)
     5 {
     6     int tot = 0;
     7     not_prime[1] = 1;
     8     phi[1] = 1;
     9     for(int i = 2; i <= n; i++)
    10     {
    11         if(!not_prime[i])prime[tot++] = i, phi[i] = i - 1;
    12         for(int j = 0; j < tot && 1LL * prime[j] * i <= n; j++)
    13         {
    14             not_prime[prime[j] * i] = 1;//每个合数x由它最小素因子prime[j]筛掉
    15             phi[i * prime[j]] = phi[i] * (i % prime[j] ? prime[j] - 1 : prime[j]);
    16             if(i % prime[j] == 0)break;//如果i % prime[j] == 0,不停止循环
    17             //那么接下来将用prime[j+1]筛去i*prime[j+1],但实际上应该用prime[i]筛去,因为i%prime[j]==0
    18         }
    19     }
    20 }

    莫比乌斯函数的线性筛

     1 bool not_prime[maxn];
     2 int prime[maxn];
     3 int Mob[maxn];
     4 void Mobius_sieve(int n)
     5 {
     6     int tot = 0;
     7     not_prime[1] = 1;
     8     Mob[1] = 1;
     9     for(int i = 2; i <= n; i++)
    10     {
    11         if(!not_prime[i])prime[tot++] = i, Mob[i] = - 1;
    12         for(int j = 0; j < tot && 1LL * prime[j] * i <= n; j++)
    13         {
    14             not_prime[prime[j] * i] = 1;//每个合数x由它最小素因子prime[j]筛掉
    15             Mob[i * prime[j]] = (i % prime[j] ? -Mob[i]: 0);
    16             if(i % prime[j] == 0)break;//如果i % prime[j] == 0,不停止循环
    17             //那么接下来将用prime[j+1]筛去i*prime[j+1],但实际上应该用prime[i]筛去,因为i%prime[j]==0
    18         }
    19     }
    20 }
  • 相关阅读:
    手动安装pydev
    pyqt5猜数小程序
    python IDE之sublime真是个好东东
    python根据字典自动生成一组省和市名
    ubuntu编译安装postgresql
    python生成随机日期字符串
    chrome浏览器视频插件
    python @的用法
    PyQt5调入数据库数据在表格中显示
    计算机视觉2D几何基元及其变换介绍和OpenCV WarpPerspective源码分析
  • 原文地址:https://www.cnblogs.com/fzl194/p/9639522.html
Copyright © 2011-2022 走看看