• [模板]线性筛素数(欧拉筛法)


    用途

    $O(n)$处理出n以内所有素数

    原理

    使用 合数=最大因数(除1和本身外)*最小质因数 的原理来筛,每个数只会被筛一次

    对于每个数i,令它是某数的最大因数,然后从小到大地找<=i的素数j,则i*j是合数

    直到找到某个j使得$i\%j==0$,因为再往后的话,j'> i的某个因子,我们能交换j'和i的这个因子,所以i不是i*j'的最大因数(或者说i*j'的最小质因数是刚才的那个j),再往后做没有意义

    例题

    luogu3383

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<queue>
     5 using namespace std;
     6 const int maxn=10000010;
     7 
     8 int rd(){
     9     int x=0;char c=getchar();int neg=1;
    10     while(c<'0'||c>'9'){
    11         if(c=='-') neg=-1;c=getchar();
    12     }
    13     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    14     return x*neg;
    15 }
    16 
    17 int N,M;
    18 int pri[maxn],cnt;
    19 bool isp[maxn];
    20 
    21 int main(){
    22     int i,j,k;
    23     N=rd();M=rd();
    24     memset(isp,1,sizeof(isp));isp[0]=isp[1]=0;
    25     for(i=2;i<=N;i++){
    26         if(isp[i]) pri[++cnt]=i;
    27         for(j=1;j<=cnt&&i*pri[j]<=N;j++){
    28             isp[i*pri[j]]=0;
    29             if(i%pri[j]==0) break;
    30         }
    31     }
    32     
    33     for(i=1;i<=M;i++){
    34         if(isp[rd()]) printf("Yes
    ");
    35         else printf("No
    ");
    36     }
    37 }
  • 相关阅读:
    销售排行榜
    视频合并的问题
    全排列的问题
    24点的游戏
    分数拆分
    竖式
    MVVM
    package
    WP8.1APP执行流程
    W
  • 原文地址:https://www.cnblogs.com/Ressed/p/10034540.html
Copyright © 2020-2023  润新知